首页 > 解决方案 > 如何使用 jinja2 显示嵌套字典?

问题描述

我有以下字典:

result = {1: {4: {6: {}, 7: {}, 8: {}}, 5: {}}, 2: {}, 3: {}}

我的目标是显示它的层次结构,如下所示:

1
    4
       6
       7
       8
    5
2
3

我能够使用python中的递归函数来实现我的目标:

def pretty(d, indent=0):
    msg = ''
    for key, value in d.items():
        msg += '\t' * indent + str(key) + '\n'
        if isinstance(value, dict):
            msg += pretty(value, indent+1)
        else:
            msg += '\t' * (indent+1) + str(value) + '\n'
    return msg

msg = pretty(result)
print(msg)

现在我想将字典传递给render_template烧瓶库的函数并使用 jinja2 来复制相同的结果。我尝试了以下代码行,但没有任何反应:

{%- for key, value in result.items() recursive%}
    {{loop(value.items())}}
{%- else  %}
    {{value}}
{%- endif %}
{%- endfor%}

您能否提出一种聪明而优雅的方式来实现我的目标?

注意:我的回答基于这个问题

标签: pythonflaskrecursionnestedjinja2

解决方案


您的模板必须打印键而不是值。

了解递归深度(对于缩进)的一种方便方法是loop.depth0变量。

所以试试这个:

from jinja2 import Template

result = {1: {4: {6: {}, 7: {}, 8: {}}, 5: {}}, 2: {}, 3: {}}

template = Template(
"""
    {% for key, value in dict.items() recursive %}
        {{'\t' * loop.depth0}}{{key}}
        {{-loop(value.items())-}}
    {% endfor %}
""")

print (template.render(dict=result))

推荐阅读