
КАТЕГОРИИ только родители где есть статьи
28 февраля 2025 г. 0:12
<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.parent is None and c.posts.count > 0 %} {# Проверяем, является ли категория родительской и есть ли у нее статьи #}
<li {% if category.slug == c.slug %}class="selected"{% endif %}>
<a href="{{ c.get_absolute_url }}" class="pt-link">
<span>{{ c.posts.count }}</span>:{{ c.title }}
</a>
</li>
{% endif %}
{% endfor %}
</ul>
В этом коде добавлена проверка c.parent is None
, которая гарантирует, что отображаются только родительские категории. Также сохранена проверка на наличие связанных статей c.posts.count > 0
.
ЛИБО 2 ВАРИАНТ
# Импортируем необходимые модули Django
from django import template
from ..models import Category # Предполагается, что модель Category определена в models.py
# Регистрируем библиотеку шаблонных тегов
register = template.Library()
@register.inclusion_tag('blog/category_list.html') # Создаем inclusion tag для отображения списка категорий
def show_categories():
"""
Функция для получения списка категорий с подсчетом связанных статей.
Возвращает только те категории, у которых есть хотя бы одна связанная статья.
"""
categories = Category.objects.all() # Получаем все категории из базы данных
active_categories = []
for category in categories:
post_count = category.posts.count() # Подсчитываем количество связанных статей
if post_count > 0: # Проверяем, есть ли у категории связанные статьи
active_categories.append({
'title': category.title,
'slug': category.slug,
'post_count': post_count,
'url': category.get_absolute_url() # Получаем URL категории
})
return {'categories': active_categories} # Передаем данные в шаблон
Этот код решает задачу следующим образом:
-
Мы создаем собственный шаблонный тег
show_categories
, который можно использовать в шаблонах Django. -
В функции выполняется запрос к базе данных для получения всех категорий.
-
Для каждой категории мы проверяем количество связанных статей (предполагается, что в модели Category есть связь с моделью Post через related_name="posts").
-
Если у категории есть хотя бы одна связанная статья, мы добавляем её в список активных категорий вместе с необходимой информацией (название, slug, количество статей и URL).
-
Данные передаются в отдельный шаблон
category_list.html
, где они могут быть отображены нужным образом.
В самом шаблоне (category_list.html
) можно использовать этот тег следующим образом:
<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 %}
<li {% if category.slug == c.slug %}class="selected"{% endif %}>
<a href="{{ c.url }}" class="pt-link">
<span>{{ c.post_count }}</span>:{{ c.title }}
</a>
</li>
{% endfor %}
</ul>
Такое решение обеспечивает более чистый и переиспользуемый код, разделяя логику обработки данных и их представление.
Пока комментариев нет.