Как скрыть категорию без статей?
У меня есть статьи, объединенные по категориям. Вот модели данных:
class Category(models.Model):
name = models.CharField(max_length=200, verbose_name='Наименование')
slug = models.SlugField(max_length=250, verbose_name='URL')
created = models.DateTimeField(auto_now_add=True, verbose_name='Добавлено')
objects = models.Manager()
class Meta:
ordering = ('name',)
verbose_name = 'категорию'
verbose_name_plural = 'Категории'
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('main:article_list_by_category', args=[self.slug])
class Article(models.Model):
STATUS_CHOICES = (
('draft', 'Черновик'),
('published', 'Опубликовано'),
)
TYPE_ARTICLE_CHOICES = (
('Руководство', 'Руководство'),
('Инструкция', 'Инструкция'),
)
title = models.CharField(max_length=250, verbose_name='Заголовок')
slug = models.SlugField(max_length=250, unique_for_date='publish', verbose_name='URL')
type_article = models.CharField(max_length=15, choices=TYPE_ARTICLE_CHOICES, default='Инструкция',
verbose_name='Тип статьи')
category = models.ForeignKey(Category,
related_name='article',
on_delete=models.CASCADE, verbose_name='Категория')
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_posts', verbose_name='Автор')
body = RichTextUploadingField(verbose_name='Статья')
publish = models.DateTimeField(default=timezone.now, verbose_name='Опубликовано')
created = models.DateTimeField(auto_now_add=True, verbose_name='Добавлено')
updated = models.DateTimeField(auto_now=True, verbose_name='Обновлено')
status = models.CharField(max_length=12, choices=STATUS_CHOICES, default='draft', verbose_name='Статус')
tags = TaggableManager()
private = models.BooleanField(default=False, verbose_name='Приватная статья')
objects = models.Manager()
published = PublishedManager()
class Meta:
ordering = ('-publish',)
verbose_name = 'статью'
verbose_name_plural = 'Статьи'
index_together = (('id', 'slug'),)
indexes = [GinIndex(fields=['title'])]
def __str__(self):
return self.title
Вот шаблон вывода:
<div class="container my-container-style">
<div class="row">
<div class="col-md-3">
<h4 class="mb-4 category">Категории</h4>
<div id="sidebar">
<ul>
<li {% if not category %} class="selected" {% endif %}>
<a href="{% url 'main:articles_list' %}">Все</a>
</li>
{% for c in categories %}
<li {% if category.slug == c.slug %} class="selected" {% endif %}>
<a href="{{ c.get_absolute_url }}">{{ c.name }}</a>
</li>
{% endfor %}
</ul>
</div>
</div>
<div class="col-md-9">
{% if tag %}
<h2 class="tag_title">Статьи с тегами: "{{ tag.name }}"</h2>
{% endif %}
{% for articles in Article %}
<div class="article col-md-12">
<a href="{{ articles.get_absolute_url }}"><h2 class="article_title">{{ articles.title }}</h2></a>
<div class="article_info">
<span>Автор: {{ articles.author.first_name }} «{{ articles.author }}» {{ articles.author.last_name }}</span>
<span>Обновлено: {{ articles.updated|date:'d-m-Y' }}</span>
<span>Тип статьи: {{ articles.type_article }}</span>
</div>
<div class="article_body">
<p>{{ articles.body|safe|truncatewords:30 }}</p>
</div>
<div class="read_more">
<p class="mb-4"><a class="btn btn-secondary button_read back" href="{{ articles.get_absolute_url }}" role="button">Читать далее »</a></p>
</div>
</div>
{% endfor %}
{% include "pagination.html" with page=Article %}
</div>
</div>
</div>
Я нашел похожий вопрос (Django how hide empty category), но я не могу скрыть категорию с помощью собственного фильтра. Как правильно скрыть категорию с нулем статей в ней?