Jinja2循环中变量重置问题:如何在迭代中保留变量值?
问题原因
Jinja2的循环会创建独立的局部作用域,你在循环外部定义的idx变量,每次进入循环迭代时,都会从外部作用域重新读取初始值(也就是0)。而你在循环内对idx的修改,只会作用于当前迭代的局部作用域,不会传递到下一次循环,所以每次循环开始idx都会被重置为0。
正确实现方法
有两种常用的解决思路:
方法一:利用Jinja2内置的loop.index0变量
Jinja2的循环自带loop.index0变量,它表示当前迭代的索引(从0开始计数),直接用它来取颜色数组的元素即可,不需要手动维护idx变量:
{% set colors = ["red", "green", "brown"] %} {% for slug in page.tags %} <a href="projects/{{ slug|lower }}" class="tag tag--{{ colors[loop.index0 % 3] }}">{{ slug }}</a> {% endfor %}
loop.index0 % 3会自动循环0、1、2,完美匹配你的颜色数组长度。
方法二:使用namespace对象保存可变状态
如果你需要手动维护一个可变的计数器(比如逻辑更复杂的场景),可以用Jinja2的namespace对象,它的属性可以在循环作用域中被修改并保留状态:
{% set colors = ["red", "green", "brown"] %} {% set ns = namespace(idx=0) %} {% for slug in page.tags %} before: {{ ns.idx }} <a href="projects/{{ slug|lower }}" class="tag tag--{{ colors[ns.idx] }}">{{ slug }}</a> {% set ns.idx = (ns.idx + 1) % 3 %} after: {{ ns.idx }} {% endfor %}
namespace对象的属性不会被循环的局部作用域隔离,所以每次修改的ns.idx会在下一次循环中生效。
内容的提问来源于stack exchange,提问作者Malvinka
相关产品推荐
相关产品推荐

