Итак, я прочитал эту статью о динамической фильтрации в Django; Динамическая фильтрация
Несмотря на то, что у меня что-то работало, мне нужно было два одинаковых представления, одно для отображения всех различных категорий с их слагом в качестве параметра, и второе представление для отображения всех сообщений из всех категорий безпараметр.
Как я могу использовать один ListView и передать пустой параметр из шаблона, чтобы показать все сообщения из всех категорий в списке?
Или это вообще возможно?
urls.py
urlpatterns = [
path('', views.PostListView.as_view(), name='index'),
path('<slug:slug>/', views.PostbyCategoryListView.as_view(), name="category"),
]
views.py
class PostListView(ListView):
model = Post
template_name = 'index.html'
class PostbyCategoryListView(ListView):
model = Post
template_name = 'index.html'
def get_queryset(self):
self.category = get_object_or_404(Category, slug=self.kwargs['slug'])
return Post.objects.filter(category=self.category)
index.html
...
<h6>Categories</h6>
{% if category_list %}
<ul>
<li class="category-item">
<a href="{% url 'index' %}">All categories</a>
</li>
{% for category in category_list %}
<li class="category-item">
<a href="{% url 'category' category.slug %}">{{ category.name }}</a>
</li>
{% endfor %}
</ul>
{% else %}
<p>No categories</p>
{% endif %}
...
models.py
class Category(models.Model):
name = models.CharField(max_length=200)
slug = models.CharField(max_length=200)
class Post(models.Model):
category = models.ForeignKey('Category',default=1, on_delete=models.SET_NULL, null=True, related_name="posts")
title = models.CharField(max_length=200)
content = models.TextField(max_length=2000)