1

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

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

4

2 回答 2

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 基于类的视图,买你可以把它改编成一个函数)

于 2013-06-26T12:23:04.200 回答
0

好吧,因为我的模板中不需要实际的对象,所以我通过将ids 列表而不是对象列表发送到我的模板来解决这个问题。

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)

并且模板代码保持不变。

于 2013-06-26T13:22:23.077 回答