检查字符串是否出现在Django模板中的对象列表中

时间:2013-06-26 10:05:20

标签: django django-templates

我从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>

是否可以单独在模板中执行此操作,还是应该为此编写额外的模板标签?

2 个答案:

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

模板代码保持不变。