
только дочерние категории
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>
Разъяснения:
-
{% for child in c.get_children %}
: Предполагается, что у каждой категории (c
) есть методget_children()
, который возвращает список дочерних категорий. Это типичная структура для древовидных данных. Если у вас используется какая-то конкретная библиотека для работы с деревьями (например,django-mptt
), используйте метод, предоставляемый этой библиотекой для получения дочерних элементов. Если вы вручную создали структуру дерева, вам нужно соответствующим образом изменить этот цикл. -
Вложенный
<ul>
: Дочерние категории отображаются во вложенном<ul>
, чтобы визуально показать их иерархию. Вы можете добавить CSS для стилизации этого вложенного списка (например, скрыть его изначально и показывать только при наведении на родительский элемент). -
child.get_absolute_url
: Предполагается, что у каждой дочерней категории также есть методget_absolute_url()
, который возвращает URL для этой категории. -
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>
. Это предотвратит создание пустых списков, если у категории нет дочерних элементов.
Пока комментариев нет.