Jinja2通过python字典递归并设置
问题描述:
我正在一个拥有几乎无穷无尽的孩子的jinja模板中循环查看字典。孩子们包含集合和字典。我试图环比下面的数据集,并通过神社打印如下面的例子:Jinja2通过python字典递归并设置
EYE
COURSES
CLASS_0E
CLASS_0F
EYE|MIT
COURSES
CLASS_1E
CLASS_2F
EYE|MIT|NIT
COURSES
CLASS_1X
CLASS_1D
EYE|MIT|NIT|XXX
COURSES
CLASS_4X
EYE|EDX
COURSES
CLASS_9A
CLASS_9B
这里与工作数据集:
SCHOOL = {
'EYE': {
'COURSES': {
'CLASS_0E',
'CLASS_0F'
},
'EYE|MIT': {
'COURSES': {
'CLASS_1E',
'CLASS_2F'
},
'EYE|MIT|NIT': {
'COURSES': {
'CLASS_1X',
'CLASS_1D'
},
'EYE|MIT|NIT|XXX': {
'COURSES': {
'CLASS_4X'
}
}
},
'EYE|EDX': {
'COURSES': {
'CLASS_9A',
'CLASS_9B'
}
}
}
}
}
这是我到目前为止已经在做试图循环但没有运气。
from jinja2 import Template
template = Template(
"""
{% for key, value in tree.items() recursive %}
{{key}}
{% if key == "COURSES" %}
COURSES
{{loop(value.items())}}
{% else %}
* GOTO INTO THE NEXT CHILD AND REPEAT THE PROCESS *
{% endif %}
{% endfor%}
""")
print(template.render(tree = SCHOOL))
我将如何解决这个的Jinja2递归问题?
答
经过一段时间的研究,我找到了答案。
from jinja2 import Template
template = Template("""
{%- macro recurse(n) %}
{%- for key, value in n.items() %}
{%- if key is not equalto 'COURSES' %}
{{key}}
{%- endif %}
{%- if 'COURSES' in value and value is iterable %}
COURSES
{%- for item in value['COURSES'] %}
{{item}}
{%- endfor %}
{%- endif %}
{%- if value.items is defined %}
{{recurse(value)}}
{%- endif %}
{%- endfor %}
{%- endmacro %}
{{ recurse(tree) }}
""")
print(template.render(tree=SCHOOL))
Jinja模板引擎有很多条件不在python中。但神社关心空格,这样你就需要格式化上面的代码是这样的:
from jinja2 import Template
template = Template("""
{% macro recurse(n) %}{% for key, value in n.items() %}{% if key is not equalto 'COURSES' %}{{key}}{% endif %}{% if 'COURSES' in value and value is iterable %}
COURSES{% for item in value['COURSES'] %}
{{item}}{% endfor %}{% endif %}{% if value.items is defined %}
{{recurse(value)}}{% endif%}{% endfor %}{% endmacro %}{{ recurse(tree) }}
""")
print(template.render(tree=SCHOOL))
这会给我下面的输出我需要:
EYE
COURSES
CLASS_0E
CLASS_0F
EYE|MIT
COURSES
CLASS_1E
CLASS_2F
EYE|MIT|NIT
COURSES
CLASS_1X
CLASS_1D
EYE|MIT|NIT|XXX
COURSES
CLASS_4X
EYE|EDX
COURSES
CLASS_9B
CLASS_9A