【问题标题】:What is the difference between using TemplateView and ListView in Django?在 Django 中使用 TemplateView 和 ListView 有什么区别?
【发布时间】:2014-10-09 16:54:53
【问题描述】:

在数据库中,我有一组问题。我想将可折叠项目中的每个问题显示为列表。之前我使用过 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 循环:

{% for question in questions %}

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

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

提前致谢。

【问题讨论】:

    标签: django django-views


    【解决方案1】:

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

    class QuestionListView(ListView):
        model = Question
    

    考虑到您没有在上下文中添加任何内容。 TemplateView's 作为基本视图是相当初级的,并且提供了一组更小的方法和属性来处理更复杂的用例,这意味着您必须在这种情况下编写更多代码。如果您查看并比较两个视图TemplateViewListView 这里,您可以更清楚地看到差异。分页就是一个很好的例子,要对ListView 进行分页,您只需设置paginate_by 属性并相应地修改您的模板。

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

    【讨论】:

    • 谢谢。您提供的链接中的层次结构图非常有用。我还发现我可以通过覆盖 get_context_object_name 函数来更改默认名称。我认为清楚地理解差异需要时间和经验。但如果你能提供一个使用 ListView 的好例子,那就太好了。再次感谢!
    • 您给出的示例是使用ListView 的教科书案例,即使您可以改用TemplateView,但在这种情况下确实没有理由。对于大多数基于类的通用视图,您会发现可以让它们像其他基于类的视图一样工作,但对于典型的用例来说这样做确实没有任何意义。
    猜你喜欢
    • 2011-06-09
    • 2020-09-20
    • 1970-01-01
    • 2014-07-22
    • 2011-03-08
    • 1970-01-01
    • 2022-08-18
    • 2014-03-02
    • 1970-01-01
    相关资源
    最近更新 更多