Django ListView 和 View 中的继承 class

Inheritance in Django ListView and View class

有人可以解释为什么这不起作用

    class MansionDesign(Listview):
        sequence = Design.objects.filter(design_type__name='maisonette').order_by('created_at').reverse()
        queryset = [sequence[i:i + 3] for i in range(0, len(sequence), 3)]
        template_name = 'designs/mansions.html'

但是当我将上面的 class 更改为如下视图的子class 时,

    class MansionDesign(View):
        def get(self, request):
            sequence = Design.objects.filter(design_type__name='maisonette').order_by('created_at').reverse()
            queryset = [sequence[i:i + 3] for i in range(0, len(sequence), 3)]
            return render(request, 'designs/mansions.html', {'object_list': queryset})

代码似乎工作正常。 我从上面 class 得到的错误是 'name sequence is not defined'。 我将不胜感激对此的一些澄清。 提前致谢。

引自文档:

ListView takes two params, one as queryset and second and template name.

现在,如果您尝试在 ListView 的子类中定义其他内容,您将收到错误消息。如果您执行以下操作:

queryset =[list(Design.objects.filter(design_type__name='maisonette').order_by('created_at').reverse())[i:i + 3] for i in range(0, len(list(Design.objects.filter(design_type__name='maisonette').order_by('created_at').reverse())), 3)]

简而言之 - 我删除了您用作序列的临时变量。上面的肯定行不通,因为它是一个列表。这个例子只是为了表达观点

现在上面的看起来不太简洁,所以如果您有复杂的查询要执行并使用列表视图显示,请按照下面的示例进行操作。您必须定义一个 get_queryset 方法,它将 return 所需的查询集对象

class PublisherBookList(ListView):

    template_name = 'books/books_by_publisher.html'

    def get_queryset(self):
        self.publisher = get_object_or_404(Publisher, name=self.args[0])
        return Book.objects.filter(publisher=self.publisher)

链接:

https://docs.djangoproject.com/en/1.11/topics/class-based-views/generic-display/#generic-views-of-objects