我想在网页中显示字典的内容。字典结构是递归的。尽管如此,我无法让它发挥作用。相反,我必须“手动展开”递归。可能,我没有正确理解文档。
不使用递归的代码(并且它可以工作)。
{% extends "base.html" %}
{% block body %}
<form action="">
{% for account in account_list['account_list'] %}
<ul>
<input type="checkbox" id="{{ account['id'] }}" value="{{ account['name'] }}" type="{{ account['type'] }}"> {{ account['name'] }} <br>
{% for key, value in account.items() %}
{% if value is not string %}
{% for acc in value %}
{% if acc is mapping %}
<ul>
<input type="checkbox" id="{{ acc['id'] }}" value="{{ acc['name'] }}" type="{{ acc['type'] }}"> {{ acc['name'] }} <br>
{% for ke, va in acc.items() %}
{% if va is not string %}
{% for ac in va %}
{% if ac is mapping %}
<ul>
<input type="checkbox" id="{{ ac['id'] }}" value="{{ ac['name'] }}" type="{{ ac['type'] }}"> {{ ac['name'] }} <br>
</ul>
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
</ul>
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
</ul>
{% endfor %}
</form>
{% endblock %}
带递归的代码,但不起作用。
{% extends "base.html" %}
{% block body %}
<form action="">
{% for account in account_list['account_list'] %}
<ul>
<input type="checkbox" id="{{ account['id'] }}" value="{{ account['name'] }}" type="{{ account['type'] }}"> {{ account['name'] }} <br>
{% for key, value in account.items() recursive %}
{% if value is not string %}
{% for acc in value %}
{% if acc is mapping %}
<ul>
<input type="checkbox" id="{{ acc['id'] }}" value="{{ acc['name'] }}" type="{{ acc['type'] }}"> {{ acc['name'] }} <br>
{% loop(acc.items()) %}
</ul>
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
</ul>
{% endfor %}
</form>
{% endblock %}
相关文档:http://jinja.pocoo.org/docs/templates/(寻找递归)
答案 0 :(得分:2)
变量loop
总是指最里面(最近的)循环。这里,它指的是循环{% for acc in value %}
。为了引用外部循环,我们应该在{% for key, value in account.items() recursive %}
循环后立即重新绑定它,类似于:
{% set outer_loop = loop %}
然后,我们使用
获得所需的结果outer_loop(acc.items())
答案 1 :(得分:0)
您可能需要将{% loop(acc.items()) %}
更改为{% loop(acc) %}
,因为外部循环需要映射,而不是列表(并在列表上调用.items
将导致错误。)
如果更改呼叫确实修复了问题,那么我会向Jinja2项目提交一个错误 - 这个应该炸毁错误,而不是默默地吞下它(因为acc.items
将是可迭代的。)