【问题标题】:Lists in Django templates not working as expectedDjango 模板中的列表未按预期工作
【发布时间】:2014-07-01 11:24:02
【问题描述】:

如果在个人资料视图中循环浏览我的用户组以插入页面的不同块,但由于某种原因,它们并不像我期望的那样等同。这是模板:

{{ 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 块中声明列表,但我绝不会这样做。关于为什么这会失败的任何想法?我错过了一些琐碎的事情吗?

【问题讨论】:

  • {% ifequal group.name "guardian" %} 呢?
  • 那行得通。为什么这行得通?另外,这将如何影响 bar 语句中的 if foo(与 for 循环相反)?
  • ifequal 是否有可能实际上将group 转换为字符串,而== 并没有隐含地这样做?
  • 您需要使用group.name,因为您要比较group 的名称,而不是group 对象。
  • docs.djangoproject.com/en/1.6/ref/templates/builtins/#ifequal 这是 1.6 的文档,它明确显示了字符串比较。为什么.name 在这里有任何价值是我的问题。总的来说,我对 python 还是很陌生,所以我可能遗漏了一些细节,但很重要。

标签: python django list templates


【解决方案1】:

使用{{ group }}group 对象隐式转换为字符串,称为__unicode____str__ 方法(取决于您的python 版本)。对于用户组,这很可能会返回一个包含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 %}

【讨论】:

  • 感谢您的分析。我最终做了一些与您的建议略有不同的事情,因为我仍然使用 groups.all() 来构建列表并在模板中使用 if in。它节省了数据库命中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
  • 2019-11-13
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
  • 2021-01-31
  • 2015-07-19
相关资源
最近更新 更多