Flask模板循环内set变量x_value_weeks无法更新值的问题
解决Jinja2循环中变量无法更新的问题
问题根源
你遇到的问题是Jinja2的作用域规则导致的:用{% set %}在循环外部声明的变量,在循环内部再次set时,会创建一个循环局部的新变量,而非修改外部的原始变量。每次循环迭代都会重新初始化这个局部变量为外部的初始值(也就是5),所以看起来变量始终没更新。
解决方案
方案1:用循环索引直接计算(推荐,最简洁)
不需要手动维护累加变量,直接利用Jinja2内置的loop.index0(从0开始的循环索引)计算x坐标:
<svg class="user-streak-svg-container" xmlns="http://www.w3.org/2000/svg"> {% for week in weeks %} <svg class="user-streak-svg-column" x="{{ 5 + loop.index0 * 10 }}"> .... </svg> {% endfor %} </svg>
loop.index0会从0开始,每次循环加1,所以第一个元素x是5+0*10=5,第二个是5+1*10=15,以此类推,完全符合你的需求。
方案2:用namespace对象维护可变变量(适合复杂逻辑)
如果你的场景需要更灵活的变量更新逻辑(比如不是固定加10),可以用Jinja2的namespace对象,它的属性是可变的,能跨循环迭代保留值:
<svg class="user-streak-svg-container" xmlns="http://www.w3.org/2000/svg"> {% set ns = namespace(x_value_weeks=5) %} {% for week in weeks %} <svg class="user-streak-svg-column" x="{{ ns.x_value_weeks }}"> .... </svg> {% set ns.x_value_weeks = ns.x_value_weeks + 10 %} {% endfor %} </svg>
这里把x_value_weeks作为namespace对象的属性,每次修改的是对象的属性,而非创建局部变量,所以更新后的值会保留到下一次循环。
内容的提问来源于stack exchange,提问作者Julian Gomez
相关产品推荐
相关产品推荐

