我以前将视图作为DetailView,但是当我想添加分页时,我需要将视图更改为ListView。但是自从这样做以来,它已经开始引发以下错误:'CategoryDetailView' object has no attribute 'object'
我相信我需要为自己分配类别,但是我不确定100%如何做到这一点。
我尝试过:
def category(self , request , *args , **kwargs):
self.object = self.get_object()
return self.object
但是它没有用,所以目前是这样。
查看:
class CategoryDetailView(ListView):
model = Category
paginate_by = 1
def get_context_data(self, **kwargs):
context = super(CategoryDetailView, self).get_context_data(**kwargs)
context['category_posts'] = Post.objects.filter(live=True, category=self.object)
return context
谢谢大家
答案 0 :(得分:1)
DetailView
一个ListView
用于渲染您指定的model
的对象列表。但是,在这里,您只想检索一个单个 Category
,并且该类别的Post
s应该使用DetailView
[Django-doc]。如文档中所指定,这种视图包含一个self.object
:
该视图正在执行时,
self.object
将包含该视图正在操作的对象。
from django.views.generic import DetailView
class CategoryDetailView(DetailView):
model = Category
def get_context_data(self, **kwargs):
context = super(CategoryDetailView, self).get_context_data(**kwargs)
context['category_posts'] = self.object.post_set.filter(live=True)
return context
此外,使用paginate_by
属性没有多大意义,因为DetailView
当然总是精确地呈现一个元素。
在URL中,您可能指定一个名为pk
的参数或一个名为slug
的参数(给定Category
有一个slug
字段)。 DetailView
将自动检索与此Category
/ pk
对应的slug
。
ListView
或者,您可以使用ListView
中的ListView
,但是可以使用Post
中的ListView
。实际上,我们可以像这样构造from django.views.generic import ListView
class CategoryDetailView(ListView):
model = Post
paginate_by = 20
def get_queryset(self):
return super().get_queryset().filter(category__id=self.kwargs['pk'])
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['category'] = Category.objects.get(id=self.kwargs['pk'])
return context
:
Category
因此,这里我们可以通过访问URL参数中的pk
来获取相关的Post
。我们在这里实现列表视图,但是在getChangedItems
s 上实现。