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 %}