基于Django类的视图与get_queryset()

时间:2017-10-20 09:30:33

标签: django

我想将get_queryset()用于基于类的视图,但我没有克服在我的模板中显示变量。

功能很简单:

class MyClassView(LoginRequiredMixin, ListView) :

    template_name = 'my_template.html'
    model = Foo

    def get_queryset(self) :

        foo = Foo.objects.order_by('-id')
        bar = foo.filter(Country=64)
        return foo, bar

我的模板:

<table style="width:120%">
                <tbody>
                <tr>
                    <th>ID</th>
                </tr>
                {% for item in foo %}
                <tr>
                    <td>{{ foo.id }}</td>
                </tr>
                {% endfor %}
                </tbody>
            </table>
<br></br>
<table style="width:120%">
                <tbody>
                <tr>
                    <th>ID</th>
                </tr>
                {% for item in bar %}
                <tr>
                    <td>{{ bar.id }}</td>
                </tr>
                {% endfor %}
                </tbody>
            </table>

我必须使用Context字典?

2 个答案:

答案 0 :(得分:7)

get_queryset的{​​{1}}方法应返回单个查询集(或项列表)。如果要将另一个变量添加到上下文中,则还要覆盖ListView

get_context_data

class MyClassView(LoginRequiredMixin, ListView) : template_name = 'my_template.html' model = Foo def get_queryset(self) : queryset = Foo.objects.order_by('-id') return queryset def get_context_data(self, **kwargs): context = super(MyClassView, self).get_context_data(**kwargs) context['bar_list'] = context['foo_list'].filter(Country=64) return context 的模板中,您可以使用ListViewobject_list(例如<model>_list),unless you set context_object_name访问查询集。我已在foo_list中使用bar_list来与之保持一致。您需要更改模板以循环显示get_context_data{% for item in foo_list %}

答案 1 :(得分:1)

两件事:

1)get_queryset返回QuerySet。你正在回归一个元组。 2)Listview默认情况下将查询集传递给名为object_list

的模板变量

但是,您可以在模板中全部执行此操作,并且不会覆盖方法。

{% for item in object_list %}
    {% if item.country == 64 %}
    <tr>
      <td>{{ item.id }}</td>
    </tr>
   {% endif %}
{% endfor %}

这将遍历所有项目Foo并且仅打印具有country == 64的项目(如果这是外键,则需要以不同方式构造查询。)

如果由于某种原因您必须在视图中执行此操作,则需要通过get_querysetget_context调整以获得两个不同的对象列表。