LukinterLab
LukInterLab

LukInterLab- -LukInterLab

profile-pic

только дочерние категории

13 февраля 2025 г. 16:47
Изображение поста

Окей, вот как можно модифицировать ваш Django-шаблон, чтобы отображать только дочерние категории (сыновьи), предполагая, что categories содержит древовидную структуру категорий, и category – текущую выбранную категорию.

<ul>
    <li><a href="{% url 'home:home' %}" class="pt-link "><span class="nav-menu-icon"><i class="lnr lnr-home"></i></span>Главная </a> </li>
    <li {% if not category %}class="selected"{% endif %}><a  href="{% url 'Blog:post_list' %}" class="pt-link active">всего-{{ count_post }}</a></li>

    {% for c in categories %}
        {% if c.is_root_node %}
            <li {% if category.slug == c.slug %}class="selected"{% endif %}><a href="{{ c.get_absolute_url }}" class="pt-link ">{{ c.title }}</a>
                <ul> <!-- Добавляем вложенный список для дочерних категорий -->
                {% for child in c.get_children %} <!-- Итерируемся по дочерним категориям текущей корневой категории -->
                    <li {% if category.slug == child.slug %}class="selected"{% endif %}><a href="{{ child.get_absolute_url }}" class="pt-link ">{{ child.title }}</a></li>
                {% endfor %}
                </ul>
            </li>

        {% endif %}
    {% endfor %}
</ul>

Разъяснения:

  1. {% for child in c.get_children %}: Предполагается, что у каждой категории (c) есть метод get_children(), который возвращает список дочерних категорий. Это типичная структура для древовидных данных. Если у вас используется какая-то конкретная библиотека для работы с деревьями (например, django-mptt), используйте метод, предоставляемый этой библиотекой для получения дочерних элементов. Если вы вручную создали структуру дерева, вам нужно соответствующим образом изменить этот цикл.

  2. Вложенный <ul>: Дочерние категории отображаются во вложенном <ul>, чтобы визуально показать их иерархию. Вы можете добавить CSS для стилизации этого вложенного списка (например, скрыть его изначально и показывать только при наведении на родительский элемент).

  3. child.get_absolute_url: Предполагается, что у каждой дочерней категории также есть метод get_absolute_url(), который возвращает URL для этой категории.

  4. category.slug == child.slug: Проверка на то, является ли дочерняя категория текущей выбранной категорией.

Важные замечания:

  • Метод get_children(): Убедитесь, что ваши категории имеют метод get_children(), который возвращает список дочерних категорий. Если вы используете библиотеку django-mptt, это может быть c.get_children(). Если категории организованы как простая плоская структура, без информации о родительских/дочерних связях, этот метод не сработает, и вам потребуется сначала построить дерево категорий на стороне Python (в представлении Django) и передать его в шаблон.
  • Стилизация CSS: Этот код создаст вложенные списки. Вам, вероятно, понадобится добавить CSS для стилизации, чтобы меню выглядело так, как вы хотите. Например, можно использовать CSS для скрытия вложенных списков по умолчанию и отображения их только при наведении на родительский пункт меню.
  • Глубина дерева: Этот код отображает только дочерние категории первого уровня. Если вам нужно отображать категории на несколько уровней вглубь, потребуется рекурсивный шаблон или, что зачастую более эффективно, предварительная обработка структуры дерева в Python и передача её в шаблон в удобном для отображения виде.
  • Производительность: При работе с большими деревьями категорий запрос всех дочерних элементов может быть неэффективным. Рассмотрите возможность использования кэширования или других методов оптимизации.

Пример с использованием django-mptt:

<ul>
    <li><a href="{% url 'home:home' %}" class="pt-link "><span class="nav-menu-icon"><i class="lnr lnr-home"></i></span>Главная </a> </li>
    <li {% if not category %}class="selected"{% endif %}><a  href="{% url 'Blog:post_list' %}" class="pt-link active">всего-{{ count_post }}</a></li>

    {% for c in categories %}
        {% if c.is_root_node %}
            <li {% if category.slug == c.slug %}class="selected"{% endif %}><a href="{{ c.get_absolute_url }}" class="pt-link ">{{ c.title }}</a>
                {% if c.get_children %}
                    <ul>
                    {% for child in c.get_children %}
                        <li {% if category.slug == child.slug %}class="selected"{% endif %}><a href="{{ child.get_absolute_url }}" class="pt-link ">{{ child.title }}</a></li>
                    {% endfor %}
                    </ul>
                {% endif %}
            </li>

        {% endif %}
    {% endfor %}
</ul>

В этом примере я также добавил {% if c.get_children %} для проверки, есть ли у категории дочерние элементы, прежде чем рендерить <ul>. Это предотвратит создание пустых списков, если у категории нет дочерних элементов.

Пока комментариев нет.

Оставьте коментарий