LukinterLab
LukInterLab

LukInterLab- -LukInterLab

profile-pic

КАТЕГОРИИ только родители где есть статьи

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}  # Передаем данные в шаблон

Этот код решает задачу следующим образом:

  1. Мы создаем собственный шаблонный тег show_categories, который можно использовать в шаблонах Django.

  2. В функции выполняется запрос к базе данных для получения всех категорий.

  3. Для каждой категории мы проверяем количество связанных статей (предполагается, что в модели Category есть связь с моделью Post через related_name="posts").

  4. Если у категории есть хотя бы одна связанная статья, мы добавляем её в список активных категорий вместе с необходимой информацией (название, slug, количество статей и URL).

  5. Данные передаются в отдельный шаблон 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>

Такое решение обеспечивает более чистый и переиспользуемый код, разделяя логику обработки данных и их представление.

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

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