Jinja2动态数组变量的for循环解析异常问题求助
解决Jinja2中动态属性访问的for循环问题
这个问题我之前也踩过坑!Jinja2的点号语法是静态解析的,所以你直接写{% for station in country.capital.stations %}的时候,它并不会把capital当成变量去取值,而是直接去查找country对象里名为capital的属性——这就和你预期的逻辑完全不符了,哪怕你已经确认capital变量能正确解析成london也没用。
正确的解决方案
根据你的数据结构类型,有两种常用的写法:
1. 如果country是字典类型
用方括号[]来动态访问键,把原来的country.capital替换成country[capital]:
{% for station in country[capital].stations %} {{ station }} {% endfor %}
这里方括号会先解析capital变量的值(比如london),再去country字典里取出对应的键值,接着访问它的stations数组。
2. 如果country是类实例对象
用Jinja2内置的getattr()函数来动态获取属性:
{% for station in getattr(country, capital).stations %} {{ station }} {% endfor %}
getattr()会先读取capital变量的值,再从country对象中获取对应名称的属性,之后就能正常遍历stations数组了。
原理说明
Jinja2的点号.语法是静态绑定的,它会把a.b.c直接解析为“a的b属性,再取b的c属性”;而方括号[]或getattr()则支持动态传入变量作为属性/键名,完美适配你这种需要根据变量值动态访问数组的场景。
内容的提问来源于stack exchange,提问作者Jon Godden
相关产品推荐
相关产品推荐

