
jinja2 模板中使用 `{% set %}` 声明的变量在循环内无法真正“更新”,因其作用域为局部且每次 `{% set %}` 实际创建新变量而非修改原值;应改用数学表达式(如 `5 + loop.index0 * 10`)实现动态计算。
在 flask 的 Jinja2 模板中,{% set %} 并不支持传统编程语言中的“可变变量赋值”语义。当你在循环内写 {% set x_value_weeks = x_value_weeks + 10 %} 时,Jinja2 并不会就地修改外层变量,而是基于当前作用域创建一个同名新变量——但由于 Jinja2 的作用域规则(尤其是循环内部的变量绑定机制),该赋值通常不会影响后续迭代中的读取,导致 x_value_weeks 始终显示初始值(如 5)。
✅ 正确做法是:避免依赖可变状态,转而使用纯函数式表达式。利用 Jinja2 内置的 loop 对象(如 loop.index0 表示从 0 开始的索引)直接计算每个 svg 的 x 坐标:
? 关键说明:
- loop.index0 返回当前循环的零基索引(第 1 次为 0,第 2 次为 1,依此类推);
- 5 + loop.index0 * 10 精确生成序列:5, 15, 25, 35…,完全替代手动累加逻辑;
- 若需从 1 开始计数,可用 loop.index(一基索引),公式改为 5 + (loop.index – 1) * 10(效果等价)。
⚠️ 注意事项:
- Jinja2 是模板渲染引擎,非通用脚本语言,不支持副作用(如状态变更)、闭包或引用传递;
- 所有复杂逻辑(如条件偏移、步长变化、边界校验)应在 Flask 视图函数中预处理并传入上下文,而非在模板中硬编码;
- 若 weeks 是空列表,loop.index0 不会触发错误,表达式仍安全求值为 5 + 0 * 10 = 5(但无循环体执行)。
总结:模板应保持声明式与无状态。把“计算逻辑”交给表达式,把“数据状态”交给后端,才是 Jinja2 的最佳实践。