如何在Django CBV ListView中拥有多个列表?

时间:2014-05-20 18:00:43

标签: django django-class-based-views

在我的应用程序中,我希望有一个索引页面,它将显示两个对象列表,其中两个列表包含相同类型的对象(即相同的模型)。

在传统的基于函数的视图中,这很容易:我定义了两个变量,将它们分配给查询集,并将它们传递到我的模板的上下文中,我可以通过名称轻松访问它们。

我还是CBV的新手,似乎有很多魔法,很多东西都是自动处理的。我理解如何覆盖ListView的查询集(默认为给定模型的所有对象),但我没有得到的是如何提供多个查询集,以便我的ListView实际上可以显示两个列表。

到目前为止,我唯一的想法是将self.object_list覆盖为两个查询集的元组,但这似乎会使我的模板代码不那么清晰,我甚至不确定它是否会起作用。

2 个答案:

答案 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>