Jinja2嵌套循环计数器

时间:2013-09-12 03:52:16

标签: flask jinja2

{% set cnt = 0 %}
{% for room in rooms %}
  {% for bed in room %}
    {% set cnt = cnt + 1 %}
  {% endfor %}
{{ cnt }}
{% endfor %}

假设我们有嵌套循环,打印的cnt总是0,因为这是我们进入1st循环时定义的内容。当我们在内部循环中递增计数器时,它似乎只是内部循环的局部变量 - 因此它将在循环内部递增,但随后本地cnt消失。我们如何修改全局cnt ???

与Jinja2 doc一样伟大,他们不清楚设置变量范围。唯一提到范围的是内部块的“范围”修饰符,但我想它不能应用于所有内容......疯狂。

3 个答案:

答案 0 :(得分:13)

作用域规则阻止您从循环内部访问在循环外声明的变量

引用Peter Hollingsworth中的his previous answer

你可以通过使用对象而不是'cnt'的标量来打败这种行为:

{% set cnt = [0] %}
{% for room in rooms %}
  {% for bed in room %}
    {% if cnt.append(cnt.pop() + 1) %}{% endif %} 
  {% endfor %}
{{ cnt[0] }}
{% endfor %}
total times through = {{ cnt[0] }}

答案 1 :(得分:6)

对于每个循环,都会生成一个具有索引属性的循环对象。

http://jinja.pocoo.org/docs/dev/templates/#for

要访问父循环索引,您可以这样做: http://jinja.pocoo.org/docs/dev/tricks/#accessing-the-parent-loop

或者您可以使用枚举,它在Jinja中与在Python中一样 https://docs.python.org/2/library/functions.html#enumerate

答案 2 :(得分:-1)

我回忆起过去使用的一种非常黑客的方式:

{% set cnt = 0 %}
{% for room in rooms %}
    {% for bed in room %}
        {% if cnt += 1 %}
    {% endfor %}
{{ cnt }}
{% endfor %}

未经测试。