jinja2 访问字典中的嵌套列表
jinja2 accessing nested list in a dict
我目前正在制作一个 python 代码生成器来快速模拟一个 django 项目。
我有一个 xml 文件,其中包含所有模型数据。从那里它会消失并使用 jinja2 模拟模型、通用视图、模板等。
虽然我正在努力让 jinja 访问字典中的嵌套列表。
code_gen.py
models = {}
tree = ET.parse('models.xml')
root = tree.getroot()
for child in root:
models[child.tag] = []
for c in child:
models[child.tag].append(c.tag)
print models
t = Template("""from django.db import models
{% for class in model %}
class {{ class }}(models.Model):
{% for occurrence in occurrences %}{{ occurrence }}{% endfor %}
{% endfor %}
""")
i = t.render(model=models)
fo = open('test.py', 'wb')
fo.write(i)
fo.close()
models.xml
<?xml version="1.0" encoding="UTF-8"?>
<Models>
<Model1>
<CharField max_length="10" null="True" blank="True">Firstname</CharField>
<IntegerFieldnull null="True" blank="True">age</IntegerField>
</Model1>
<Model2>
<EmailField max_length="10" null="True" blank="True">email</EmailField>
<DateField null="True" blank="True">DOB</DateField>
</Model2>
</Models>
如果我打印出模型,我会得到:
{'Model2': ['EmailField', 'DateField'], 'Model1': ['CharField', 'IntegerField']}
当我将它添加到模板时,我得到了 class 名称,但得到了字段的 none。
问题是您正在使用 {% for occurrence in occurrences %}
,但您没有在任何地方设置 occurrences
。
最简单的解决方法是遍历字典的项目,然后同时拥有它们的键(模型)和值(字段列表)。
{% for class, occurences in model.items() %}
class {{ class }}(models.Model):
{% for occurrence in occurrences %}{{ occurrence }}{% endfor %}
{% endfor %}
我目前正在制作一个 python 代码生成器来快速模拟一个 django 项目。
我有一个 xml 文件,其中包含所有模型数据。从那里它会消失并使用 jinja2 模拟模型、通用视图、模板等。
虽然我正在努力让 jinja 访问字典中的嵌套列表。
code_gen.py
models = {}
tree = ET.parse('models.xml')
root = tree.getroot()
for child in root:
models[child.tag] = []
for c in child:
models[child.tag].append(c.tag)
print models
t = Template("""from django.db import models
{% for class in model %}
class {{ class }}(models.Model):
{% for occurrence in occurrences %}{{ occurrence }}{% endfor %}
{% endfor %}
""")
i = t.render(model=models)
fo = open('test.py', 'wb')
fo.write(i)
fo.close()
models.xml
<?xml version="1.0" encoding="UTF-8"?>
<Models>
<Model1>
<CharField max_length="10" null="True" blank="True">Firstname</CharField>
<IntegerFieldnull null="True" blank="True">age</IntegerField>
</Model1>
<Model2>
<EmailField max_length="10" null="True" blank="True">email</EmailField>
<DateField null="True" blank="True">DOB</DateField>
</Model2>
</Models>
如果我打印出模型,我会得到:
{'Model2': ['EmailField', 'DateField'], 'Model1': ['CharField', 'IntegerField']}
当我将它添加到模板时,我得到了 class 名称,但得到了字段的 none。
问题是您正在使用 {% for occurrence in occurrences %}
,但您没有在任何地方设置 occurrences
。
最简单的解决方法是遍历字典的项目,然后同时拥有它们的键(模型)和值(字段列表)。
{% for class, occurences in model.items() %}
class {{ class }}(models.Model):
{% for occurrence in occurrences %}{{ occurrence }}{% endfor %}
{% endfor %}