在我的应用程序中,我希望有一个索引页面,它将显示两个对象列表,其中两个列表包含相同类型的对象(即相同的模型)。
在传统的基于函数的视图中,这很容易:我定义了两个变量,将它们分配给查询集,并将它们传递到我的模板的上下文中,我可以通过名称轻松访问它们。
我还是CBV的新手,似乎有很多魔法,很多东西都是自动处理的。我理解如何覆盖ListView的查询集(默认为给定模型的所有对象),但我没有得到的是如何提供多个查询集,以便我的ListView实际上可以显示两个列表。
到目前为止,我唯一的想法是将self.object_list覆盖为两个查询集的元组,但这似乎会使我的模板代码不那么清晰,我甚至不确定它是否会起作用。
答案 0 :(得分:4)
如果您不想在多列表视图中支持分页,我建议覆盖get_context_data并获取视图类的方法
def get_context_data(self, **kwargs):
"""
Get the context for this view.
"""
queryset = kwargs.pop('object_list', self.object_list)
queryset2 = kwargs.pop('object_list', self.object_list2)
context = {
'paginator': None,
'page_obj': None,
'is_paginated': False,
'object_list': queryset,
'object_list3': queryset2
}
context.update(kwargs)
return context
def get(self, request, *args, **kwargs):
self.object_list1 = self.get_queryset1()
self.object_list2 = self.get_queryset2()
context = self.get_context_data()
return self.render_to_response(context)
对不起名字(1和2),但每当我放置" get_queryset1"
这样的名字时,你应该放置更多的描述性内容。答案 1 :(得分:1)
两个列表中的项目有什么区别?如果您正在谈论可以通过某些属性将其拆分为两个的单个列表(即查询集),则应该只在模板本身中完成。
例如,假设您有一个用户列表,并且您希望按性别显示它们,即一个列表中的男性和另一个列表中的女性。在这种情况下,只需使用ListView
返回一个正常的查询集,然后在模板中输入如下内容:
<h4>Male Users</h4>
<li>
{% for user in users %}
{% if not user.is_female %}<ul>{{ user.full_name }}</ul>
{% endfor %}
</li>
<h4>Female Users</h4>
<li>
{% for user in users %}
{% if user.is_female %}<ul>{{ user.full_name }}</ul>
{% endfor %}
</li>