我想将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
字典?
答案 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
的模板中,您可以使用ListView
或object_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_queryset
和get_context
调整以获得两个不同的对象列表。