【问题标题】:Jinja2 nested loop counterJinja2 嵌套循环计数器
【发布时间】:2013-09-12 03:52:16
【问题描述】:
{% set cnt = 0 %}
{% for room in rooms %}
  {% for bed in room %}
    {% set cnt = cnt + 1 %}
  {% endfor %}
{{ cnt }}
{% endfor %}

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

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

【问题讨论】:

  • 我搜索了一段时间,发现很多类似的问题但没有答案。我的解决方案是使用一个 do 块和一个自定义类,该类具有一个增加变量的方法,因为 Jinja 不允许在 do 块中使用赋值语句。所以像 {% do cnt.increment() %} 在 for 循环中。

标签: flask jinja2


【解决方案1】:

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

从his previous answer引用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] }}

【讨论】:

    【解决方案2】:

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

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

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

    或者你可以使用 enumerate,它在 Jinja 和 Python 中的工作方式相同 https://docs.python.org/2/library/functions.html#enumerate

    【讨论】:

    【解决方案3】:

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

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

    未测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多