Skip to main content
 首页 » 编程设计

python之Flask/Jinja2之遍历嵌套字典

2025年05月04日11luoye11

我试图以一堆嵌套的无序列表的形式显示字典的内容和结构。

我设法收集的数据如下所示,

{'.': {'walk.py': None, 'what.html': None, 'misc': {}, 'orders': {'order1.html':  None, 'more': {'stuff.html': None}}}} 

代表这个目录树,

.: 
misc/  orders/  walk.py  what.html 
 
./misc: 
 
./orders: 
more/  order1.html 
 
./orders/more: 
stuff.html 

我将如何使用 Jinja2 语法对此进行迭代?有更好的方法吗?

提前致谢。

编辑:我觉得自己很愚蠢。再次寻找解决方案后,我发现了我正在寻找的东西。猜猜第一次尝试时我的 google-fu 并不真正适合我。 Here it is...

请您参考如下方法:

通过使用 for loop 的 recursive 修饰符(示例取自文档):

<ul class="sitemap"> 
{%- for item in sitemap recursive %} 
    <li><a href="{{ item.href|e }}">{{ item.title }}</a> 
    {%- if item.children -%} 
        <ul class="submenu">{{ loop(item.children) }}</ul> 
    {%- endif %}</li> 
{%- endfor %} 
</ul> 

更新

这是我想到的:

from jinja2 import Template 
 
x = Template("""{%- for key, value in tree.iteritems() recursive %} 
{{ '--' * (loop.depth-1) }}{{ key }} 
{%- if value is mapping -%}/{{ loop(value.iteritems()) }}{%- endif -%} 
{%- endfor %} 
""") 
 
tree = {'.': { 
    'walk.py': None, 
    'what.html': None, 
    'misc': {}, 
    'orders': { 
        'order1.html': None, 
        'more': { 
            'stuff.html': None 
        } 
    } 
}} 
 
print x.render(tree=tree) 

输出:

./ 
--walk.py 
--what.html 
--misc/ 
--orders/ 
----order1.html 
----more/ 
------stuff.html 

(Jinja2 代码中的破折号(例如 {%- ... -%} 用于 whitespace control 。尝试一下。)