Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flask Jinja2嵌套循环计数器_Flask_Jinja2 - Fatal编程技术网

Flask Jinja2嵌套循环计数器

Flask Jinja2嵌套循环计数器,flask,jinja2,Flask,Jinja2,假设我们有嵌套循环,打印的cnt将始终为0,因为这是我们在输入第一个for循环时定义的。当我们在内环中增加计数器时,它似乎只是内环的一个局部变量——因此它在循环中会增加,但随后局部cnt就消失了。我们如何修改全局cnt 尽管Jinja2文档可能很棒,但它们不清楚设置的变量范围。唯一提到作用域的是内部块的“作用域”修饰符,但我想它不能应用于所有的东西。。。疯狂。对于每个循环,都会生成一个具有索引属性的循环对象 要访问父循环索引,可以执行以下操作: 或者您可以使用enumerate,它在Jinj

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


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

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

要访问父循环索引,可以执行以下操作:

或者您可以使用enumerate,它在Jinja中的工作方式与在Python中的工作方式相同

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

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

未测试。

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

引用

您可以通过使用对象而不是“cnt”的标量来克服此行为:

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

我搜索了一会儿,发现了很多类似的问题,但没有找到答案。我的解决方案是使用一个do块和一个自定义类,该类有一个递增变量的方法,因为Jinja不允许在do块内使用赋值语句。因此,类似于for循环中的{%do cnt.increment()%}。请注意,为了使用
enumerate
,您必须创建一个自定义筛选器,或者在已对其使用
enumerate
的列表中传递。
{% 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] }}