[英]Lists in Django templates not working as expected
如果在配置文件视图中循环访问我的用户组以插入页面的不同块,但由于某种原因,它们并不像我期望的那样等同。 这是模板:
{{ user_groups }}
{% for g in user_groups %}
{{ g }}
{% if g == "client" %}
client things
{% endif %}
{% if g == "guardian" %}
guardian things
{% endif %}
{% endfor %}
{% for group in request.user.groups.all %}
{{ group }}
{% ifequal group "guardian" %}
this is a guardian
{% endifequal %}
{% endfor %}
{% if "guardian" in user_groups %}
Give me some guardian stuff
{% endif %}
输出:
[<团体:监护人>]监护人监护人
正如你所看到的,我已经用实际的用户对象和传递给context []的列表完成了这个。 在这两种情况下,列表本身都没有问题迭代。 两个循环都显示原始变量输出,但是等于操作失败。
我可以让它做比较像{% ifequal "something" "something" %}
这将显示if块内的内容,但将列表元素与字符串进行比较似乎没有任何方式我尝试把它做完。
我知道我不能在if块中声明列表,但在任何情况下我都不这样做。 有关为什么会失败的任何想法? 我错过了一些微不足道的事吗?
使用{{ group }}
隐式地将group
对象转换为字符串,调用它的__unicode__
或__str__
方法(取决于您的python版本)。 对于用户组,这很可能会返回包含group.name
值的group.name
。
但是,这种隐式转换不会发生在if
语句中(并且不应该)。 因此,字符串"guardian"
永远不能等于组对象guardian
。
我建议将此逻辑放入您的视图而不是模板中,您可以在其中使用更多功能并进行实际过滤:
def myview(request):
context['is_guardian'] = request.user.groups.filter(name='guardian').exists()
context['is_client'] = request.user.groups.filter(name='client').exists()
return render(request, 'my_template.html', context)
而你的模板:
{% if is_guardian %}
...
{% endif %}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.