在Jinja上显示递归内容

时间:2012-10-25 11:30:08

标签: jinja2

我想在网页中显示字典的内容。字典结构是递归的。尽管如此,我无法让它发挥作用。相反,我必须“手动展开”递归。可能,我没有正确理解文档。

不使用递归的代码(并且它可以工作)。

{% 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/(寻找递归)

2 个答案:

答案 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 是可迭代的。)