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

假设我们有嵌套循环,打印的 cnt 将始终为 0,因为这是我们进入第一个 for 循环时定义的。当我们在内部循环中递增计数器时,它似乎只是内部循环的局部变量——所以它会在循环内部递增,但随后本地 cnt 消失了。我们如何修改全局cnt???

尽管 Jinja2 文档可能很棒,但他们不清楚设置变量范围。唯一提到作用域的是内部块的“作用域”修饰符,但我想它不能应用于所有东西......疯狂。

4

3 回答 3

22

范围规则阻止您从循环内部访问在循环外部声明的变量

引用Peter Hollingsworth之前的回答

您可以通过使用对象而不是 '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] }}
于 2015-12-09T22:13:06.087 回答
8

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

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相同的 enumerate

于 2014-12-16T15:37:18.860 回答
-3

我记得过去使用的一种非常hacky的方式:

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

未测试。

于 2015-03-16T20:33:15.077 回答