Jinja2中~的反向操作:如何在循环内动态获取变量实际值?
解决Jinja2循环中动态访问属性值的问题
嘿,我懂你碰到的麻烦了——Jinja2不会自动把拼接出来的字符串当作变量路径来求值,所以你现在得到的只是一串文本路径,而不是widget_data里对应的实际值。不过咱们换个思路,不用纠结怎么把字符串转成表达式,直接用Jinja2的动态属性访问语法就能搞定!
正确的实现方式
利用Jinja2的方括号属性访问语法,可以动态生成属性名并直接访问对应的值,代码如下:
{% for item in range(3) %} {% set attr_name = "text" if loop.index == 1 else "text_" ~ loop.index %} {% set texter = widget_data[attr_name].value %} {# 这里可以添加你需要的逻辑,比如输出验证:{{ texter }} #} {% endfor %}
为什么这个方法管用?
Jinja2支持通过对象[属性名]的方式来动态访问属性(不管是字典的键,还是自定义对象的属性)。我们先根据循环的索引loop.index生成对应的属性名:
- 当
loop.index为1时,属性名是"text" - 当索引大于1时,属性名是
"text_" + 索引值
之后直接用widget_data[attr_name]就能拿到对应的子对象,再链式访问.value就得到了你想要的实际值,完全绕开了字符串转表达式的问题。
额外说明
如果widget_data是一个字典,这个方法同样适用;如果是自定义的Python对象,只要它的属性可以通过这种方括号方式访问(或者Jinja2默认支持属性访问),这段代码就能正常工作。
内容的提问来源于stack exchange,提问作者JSum
相关产品推荐
相关产品推荐

