在Flask中如何在Python表达式内获取Jinja2循环的索引?
解决Flask模板表格展示字典列表的语法错误
错误原因
你的模板代码存在几个关键问题:
- Jinja2语法违规:在
{{ }}块内部嵌套了另一个{{ }},Jinja2会将整个{{ }}内的内容当作Python表达式解析,不需要额外嵌套标记。 - 列表访问方式错误:你用了函数调用的
data(...)格式,Python列表元素的正确访问方式是方括号data[...]。 - 冗余的元素获取:循环
{% for person in data %}已经将列表中的每个字典赋值给了person变量,直接使用这个变量就能获取对应字段,完全不需要借助loop.index重新索引列表。
修正后的模板代码
直接使用循环变量person访问字段,这是最简洁且正确的写法:
<!DOCTYPE html> <html> <body> <table> <tr> <th>Name</th> <th>Age</th> </tr> {% for person in data %} <tr> <td>{{ person["name"] }}</td> <td>{{ person["age"] }}</td> <!-- 也可以用点语法简化:{{ person.name }}、{{ person.age }} --> </tr> {% endfor %} </table> </body> </html>
若非要使用loop.index(不推荐)
如果确实需要通过索引访问列表元素,正确写法是去掉嵌套的{{ }},直接在表达式里使用loop.index,注意Jinja2的loop.index从1开始,而Python列表索引从0开始,需要减1:
<td>{{ data[loop.index - 1]["name"] }}</td> <td>{{ data[loop.index - 1]["age"] }}</td>
额外注意
你的后端代码里render_template("index.html", data=dummy_data)是正确的,但错误日志显示你渲染的是app.html,请确保模板文件名一致,避免出现找不到模板的问题。
内容的提问来源于stack exchange,提问作者loopingexpress
相关产品推荐
相关产品推荐

