get_query_set() 和 get_context_data() 的用途和好处是啥?我们可以在一个视图中同时使用它们吗?

Posted

技术标签:

【中文标题】get_query_set() 和 get_context_data() 的用途和好处是啥?我们可以在一个视图中同时使用它们吗?【英文标题】:What are the uses and benefits of get_query_set() and get_context_data()? Can we use both of them together inside a view?get_query_set() 和 get_context_data() 的用途和好处是什么?我们可以在一个视图中同时使用它们吗? 【发布时间】:2019-11-05 08:36:47 【问题描述】:

我在浏览 Django 文档时遇到了两种显示对象数据的方法。我想知道我们是否可以在单个视图中同时使用get_query_set()get_context_data。例如,如果我有 3 个名为 Publisher, Books, Author 的模型,其中 BooksAuthor 通过 ManyToMany 字段相互关联,BooksPublisher 通过 ForeignKey 关联。

有风景

           template_name='some_name.html'

有两种通过获取对象来显示数据的方法。

       self.Publisher=get_object_or_404(Publisher,name=self.kwargs('name_of_publisher')

            return Books.objects.filter(publisher=self.publisher)

我认为它将返回与name_of_publisher 相关的所有 Book 对象。我想问一下数据将如何显示?模板中会有循环吗? Url 会是什么样子,如果没有定义context,那么它将如何显示数据?

我遇到的第二种方法是

def get_context_data(self,**kwargs):
    context=super().get_context_data(**kwargs)
    context['publisher']=self.publisher
    return context

我发现这个的工作非常混乱。我无法理解这是如何在这里工作的。我也在这里阅读了另一篇文章,以防万一您尝试给我一个链接。提前感谢您。但我所知道的是,这两者都可以在单个templateListView 中使用吗?如果是,请描述template 文件的外观。

【问题讨论】:

【参考方案1】:

get_context_data() 为上下文字典准备数据。如果您需要添加自定义数据,请覆盖您已经完成的方式。

get_queryset() 准备要在模板中显示的数据。 get_queryset() 的返回值将用于上下文字典中的“object_list”键。您可以覆盖 get_queryset() 方法以根据所需条件过滤数据。因此,要访问模板文件中的数据,请在模板文件中包含以下内容:

% for item in object_list %
    <li> item.field1  -  item.field2  -  item.field2 </li>
% endfor %

【讨论】:

以上是关于get_query_set() 和 get_context_data() 的用途和好处是啥?我们可以在一个视图中同时使用它们吗?的主要内容,如果未能解决你的问题,请参考以下文章

python发送邮件

子类化models.Manager

Django补充

如何找到两个 Django 查询集的交集?

& 和 && 区别和联系,| 和 || 区别和联系

第三十一节:扫盲并发和并行同步和异步进程和线程阻塞和非阻塞响应和吞吐等