如何在Jinja2模板中将字典渲染为指定格式表格?
解决Jinja2渲染字典为指定表格的问题
你的原代码存在两处核心问题:一是Jinja2语法错误,二是逻辑不符合需求,以下是修正后的方案:
原代码问题分析
- 语法错误:
{% tr for %}写法错误,Jinja2的循环标签必须是{% for ... %},不能将HTML标签嵌入模板控制标签内。 - 逻辑偏差:原代码循环字典的每个键值对生成单独行,但实际需求是一行包含所有字段,表头对应字典的键,表体对应对应值,且IP列表需要转为逗号分隔的字符串。
修正后的Jinja2模板代码
<table class="s-table"> <thead> <tr> <!-- 生成表头:将字典键首字母大写 --> {% for key in groups.keys() %} <th>{{ key|capitalize }}</th> {% endfor %} </tr> </thead> <tbody> <tr> <!-- 生成表体行:处理不同类型的值 --> {% for value in groups.values() %} <td> {% if value is iterable and value is not string %} <!-- 列表类型用逗号拼接成字符串 --> {{ value|join(', ') }} {% else %} <!-- 普通字符串/直接值直接输出 --> {{ value }} {% endif %} </td> {% endfor %} </tr> </tbody> </table>
额外说明
如果需要固定列的顺序(比如必须严格按照place→name→IP排列),因为Python 3.7以下的字典不保证插入顺序,可手动指定键的顺序,替换表头和表体的循环:
<thead> <tr> {% for key in ['place', 'name', 'IP'] %} <th>{{ key|capitalize }}</th> {% endfor %} </tr> </thead> <tbody> <tr> {% for key in ['place', 'name', 'IP'] %} <td> {% if groups[key] is iterable and groups[key] is not string %} {{ groups[key]|join(', ') }} {% else %} {{ groups[key] }} {% endif %} </td> {% endfor %} </tr> </tbody>
内容的提问来源于stack exchange,提问作者Sashaank
相关产品推荐
相关产品推荐

