ListView View对象没有属性“对象”

时间:2019-05-14 20:23:42

标签: python html django

我以前将视图作为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

谢谢大家

1 个答案:

答案 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 上实现。