如何在循环外访问Jinja2 for循环变量?

时间:2012-07-30 19:34:31

标签: python jinja2

我有一个Jinja2模板页面,其中包含两个单独的{% for %}循环。如果这些循环都不包含任何项目,我希望页面重定向。

我正在尝试做这样的事情(伪代码):

loop1 = loop.length (in first loop)
loop2 = loop.length (in second loop)

if loop1 + loop2 == 0: redirect # (outside both loops)

这甚至可能吗?有没有办法让loop.length变量在各自的循环之外可用?

4 个答案:

答案 0 :(得分:0)

你可以检查你的清单是否真实,在Jinja2中空列表是假的。

{% if things %}
    {% for thing in things %} .... {% endfor %}
{% else %}
    <!-- redirect here -->
{% endif %}

答案 1 :(得分:0)

简单的答案是“不”:你不能使用模板重定向 - 它应该在控制器/服务器的视图逻辑中。

虽然技术上可以,但不能做任何人的任何好处。

答案 2 :(得分:0)

假设两件事都是列表,你可以这样做:

{% set all_things = thing1 + thing2 %}
{% if all_things %}
    {# There is more than one thing in the two lists #}
{% else %}
    {# redirect #}

话虽如此,这是属于模板级别的内容 - 您每次生成包含thing1thing2中所有内容的其他列表点击页面,这将耗费资源。您将应用程序逻辑放在模板级别中,这将无法维护。最后,您正在撰写更大的问题 - 对后端代码进行更改是非常昂贵的。 (请理解,在所有这些情况下,“你”是通用的“你” - 就像“你工作的公司”一样。)

您(具体而言)应该向那些要​​求您实施此hack并尝试更改此工具/产品/公司在成为FrankenCode之前所采取的方向的问题提出这些问题。

祝你好运!

答案 3 :(得分:0)

您可以使用length filter检查长度things对象(您正在循环的对象):

{{things|length}}

现在回答你的问题。假设您循环的对象名为t1t2,您可以这样做:

{% if t1 | length == 0 and t2 | length == 0 %}
 //use javascript to redirect(assuming you have the link)
{% endif %}

您可以在JavaScript块中执行此操作。我不知道这是否是最有效的方法,但它应该有效。

我发布了这个答案,因为这个问题没有被投票或接受的答案 我希望这有帮助。