Django通用视图中get_context_data和queryset之间的区别?

Posted

技术标签:

【中文标题】Django通用视图中get_context_data和queryset之间的区别?【英文标题】:Diference between get_context_data and queryset in Django generic views? 【发布时间】:2017-12-03 00:53:01 【问题描述】:

Django 通用视图中的get_context_dataqueryset 有什么区别?他们似乎做同样的事情?

【问题讨论】:

他们是如何做同样的事情的,get_context_data() 返回一个上下文字典。 queryset 是一个 Django QuerySet 实例。 他们实现了同样的目标 他们不...the get_context_data docs 的第一行说了什么?...您对他们所做的事情的解释是什么让您认为他们是相同的? 你了解字典和查询集的区别吗?? 他们所做的不是他们是什么,但这就是我要求专家阐明的原因。 【参考方案1】:

这些是完全不同的东西。

get_context_data() 用于生成可在模板中访问的变量的字典。 queryset 是由模型实例组成的 Django ORM 查询集

ListViewget_context_data() 的默认实现将get_queryset() 的返回值(默认情况下仅返回self.queryset)作为objects_list 变量添加到上下文中。

【讨论】:

【参考方案2】:

get_context_data()

此方法用于填充字典以用作模板上下文。例如,ListViews 会将 get_queryset() 的结果填充为 object_list。您可能会最常覆盖此方法以添加要在模板中显示的内容。

def get_context_data(self, **kwargs):
    data = super().get_context_data(**kwargs)
    data['some_thing'] = 'some_other_thing'
    return data

然后你可以在你的模板中引用这些变量。

<h1> some_thing </h1>

<ul>
% for item in object_list %
    <li> item.name </li>
% endfor %    
</ul>

此方法仅用于为模板提供上下文。

get_queryset()

ListViews 使用 - 它确定要显示的对象列表。默认情况下,它只会为您提供您指定的模型的所有内容。通过覆盖此方法,您可以扩展或完全替换此逻辑。 Django documentation on the subject.

【讨论】:

【参考方案3】:

为什么不看看代码。

http://ccbv.co.uk/projects/Django/1.11/django.views.generic.list/ListView/

单击 get() 方法表明它调用 get_queryset() 方法来获取查询集 - 通常在 ListView 中迭代。

进一步调用 get context_data() 可以将额外的变量传递给模板。

【讨论】:

以上是关于Django通用视图中get_context_data和queryset之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

基于 Django 类的通用视图和 ModelForms

如果使用通用视图,是不是需要在 django 模板表单中填写动作属性

Django 通用类视图

Django 通用视图:何时使用 ListView 与 DetailView

Django编写通用更新视图

是否可以将请求数据访问到 django 通用列表视图中?