Использование DetailView
A ListView
используется для визуализации списка объектов указанного вами model
. Здесь, однако, вы хотите получить только один Category
и Post
этой категории, поэтому вы должны использовать DetailView
[Django- документ] . Как указано в документации, такое представление содержит self.object
:
Во время выполнения этого представления self.object
будет содержать объект , с которым работает представление.
from django.views.generic import <b>DetailView</b>
class CategoryDetailView(<b>DetailView</b>):
model = Category
def get_context_data(self, **kwargs):
context = super(CategoryDetailView, self).get_context_data(**kwargs)
context['category_posts'] = <b>self.object.post_set.filter(live=True)</b>
return context
кроме того, нет смысла использовать атрибут paginate_by
, поскольку DetailView
, конечно, всегда отображает ровно один элемент.
В URL вы, вероятно, указываете параметр с именем pk
или параметр с именем slug
(учитывая, что Category
имеет поле slug
). DetailView
автоматически получит Category
, который соответствует этому pk
/ slug
.
Использование ListView
Кроме того, вы можете использовать ListView
, но в этом случае ListView
из Post
с. Действительно, мы можем построить такие ListView
как:
from django.views.generic import <b>ListView</b>
class CategoryDetailView(<b>ListView</b>):
model = <b>Post</b>
paginate_by = 20
def get_queryset(self):
return super().get_queryset().filter(<b>category__id=self.kwargs['pk']</b>)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['category'] = <b>Category.objects.get(id=self.kwargs['pk'])</b>
return context
Здесь мы можем получить релевантный Category
, обратившись к pk
в параметрах URL. Однако здесь мы реализуем представление списка поверх Post
s .