在Django中使用TemplateView和ListView有什么区别?

时间:2014-08-15 22:33:59

标签: django django-views

在数据库中,我有一组问题。我想将可折叠项目中的每个问题显示为列表。以前我用的是TemplateView:

class questionmanager(TemplateView):
    template_name = 'questionmanager.html'
    questions = Question.objects.all() 

    def get_context_data(self, **kwargs):
        context = ({
            'questions': self.questions,
        })
        return context  

然后,我读到使用ListView更好的做法来表示对象列表。然后我改变了我的课程:

class QuestionListView(ListView):
    model = Question

    def get_context_data(self, **kwargs):
        context = super(QuestionListView, self).get_context_data(**kwargs)
        return context

在旧模板中,我将其用于循环:

{% for question in questions %}

我认为当我使用ListView而不是TemplateView时,我不需要使用for循环;但我无法列出没有for循环的项目。我找到了一个示例here,在我看来,唯一的区别是在for循环中我们使用 object_list {% for question in **object_list** %})而不是使用我们传入的参数背景。

我真的没有看到使用TemplateView和ListView之间的这么多差异 - 花了一个小时就可以了。如果有人解释为什么使用ListView而不是TemplateView是一种更好的做法(在这种情况下),我将不胜感激。

提前致谢。

1 个答案:

答案 0 :(得分:6)

对于这样的简单用例,没有太大区别。但是,此示例中的ListView更加清晰,因为它可以简化为:

class QuestionListView(ListView):
    model = Question

考虑到你没有把任何东西放在上下文中。 TemplateView's作为基本视图是相当基础的,并且提供了一组更小的方法和属性来处理更复杂的用例,这意味着您必须在这样的实例中编写更多代码。如果您在这里查看并比较两个观看次数TemplateViewListView,您可以更清楚地看到差异。分页是一个很好的例子,为ListView分页只需设置paginate_by属性并相应地修改模板。

另请注意,您可以通过在“ListView”中设置object_list来更改默认名称context_object_name