我从Django(v1.5.1)视图向我的模板发送两个查询:
def my_view(request):
query1 = auth.acc() # some api call
query2 = Characters.objects.filter(user=request.user)
rcontext = RequestContext(request, {'q1': query1, 'q2': query2})
return render_to_response('api_character.haml', rcontext)
我想检查一个查询中的字符串是否出现在另一个查询中,并相应地选中/取消选中页面上的复选框:
<ul>
{% for item in q1 %}
<li>
{{item.name}}
{# check if item.id appears in list of objects q2 (each q2 has its own q2.id property) #}
{% if item.id in q2 %}
<input type="checkbox" checked="checked">
{% else %}
<input type="checkbox">
{% endif %}
</li>
{% endfor %}
</ul>
是否可以单独在模板中执行此操作,还是应该为此编写额外的模板标签?
答案 0 :(得分:1)
在django 1.5中,我会在views.py中编写它:
class MyView(TemplateView):
template_name = "api_character.haml"
def get_context_data(self, **kwargs):
context = super(MyView, self).get_context_data(**kwargs)
context["query1"] = auth.acc() # some api call
context["query2"] = Characters.objects.filter(user=request.user).values_list('id', flat=True)
return context
或功能:
def my_view(request):
query1 = auth.acc() # some api call
query2 = Characters.objects.filter(user=request.user).values_list('id', flat=True)
rcontext = RequestContext(request, {'q1': query1, 'q2': query2})
return render_to_response('api_character.haml', rcontext)
但是,模板有什么问题?它会失败吗?
修改强>
现在我知道你想要什么,请查看代码。
请注意values_list
(我喜欢基于django类的视图,买你可以将它改编成一个函数)
答案 1 :(得分:0)
好吧,因为我的模板中不需要实际的对象,所以我通过将id
的列表发送到我的模板而不是对象列表来解决这个问题。
def my_view(request):
query1 = auth.acc() # some api call
query2 = Characters.objects.filter(user=request.user)
chars = []
for ch in query2:
chars.append(ch.id)
rcontext = RequestContext(request, {'q1': query1, 'q2': chars})
return render_to_response('api_character.haml', rcontext)
模板代码保持不变。