【发布时间】:2021-02-23 12:44:58
【问题描述】:
我正在尝试使用 CSV 作为输入来构建基于 jinja2 模板的输出。如何使用模板内的 for 循环而不是 python 代码内的循环来呈现输出?
这是我一直在处理的代码。如果模板中没有 for 循环,代码可以正常工作。当 for 循环添加到模板时,输出包含重复的相同 vlan 信息。
有没有办法在模板中包含for循环,以便在模板级别执行迭代?
import csv
from jinja2 import Template
source_file = "VLAN.csv"
vlan_template_file = "vlan.j2"
vlan_configs = ""
with open(vlan_template_file) as tf:
vlan_template = Template(tf.read(), keep_trailing_newline=True)
with open(source_file) as sf:
reader = csv.DictReader(sf)
for row in reader:
vlan_config = vlan_template.render(row)
vlan_configs += vlan_config +"!\n"
print(vlan_configs)
`
vlan_configs 输出提供了两次 vlan 详细信息。
CSV 文件格式:
vlan_id,vlan_name
10,VLAN_10
11,VLAN_11
12,VLAN_12
jinja2 模板:
{% for vlan_id in row %}
vlan {{vlan_id}}
name {{vlan_name}}
{% endfor %}
【问题讨论】:
-
您的 Python 代码中可能不需要
for row in reader:行。该行每row执行一次下面的代码。但是模板for也每row执行一次。顺便说一句,您可以编辑代码以使其缩进良好吗?谢谢! -
你能把
reader作为vlan_template.render(reader)传递给jinja2模板吗? -
感谢您的反馈 rturrado。当我将代码更改为
vlan_template.render(reader)时,出现以下错误:line 1086, in render vars = dict(*args, **kwargs)ValueError: dictionary update sequence element #0 has length 5; 2 is required -
没错。如果你想在模板中使用 for 循环,你需要传递 reader 变量,它是一个字典。所以你必须相应地修改模板代码。例如。
for vlan_id in reader和name {{reader[vlan_id]}}或类似的东西。