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