如何使用 django 模板递归提取分层字典?

How can I recursively extract a hierarchical dictionary using a django template?

我有层级结构:

{
    "content": "Header 1", 
    "name": "folder/name.txt", 
    "decendent": [
         {
            "content": "Header 2", 
            "name": "folder/subfolder/name.txt", 
            "decendent": null
        }, 
        {
            "content": "Header 3", 
            "name": "folder/subfolder2/name.txt", 
            "decendent": [
                {
                    "content": "Header 4", 
                    "name": "folder/subfolder2/subsubfolder1/name.txt", 
                    "decendent": null
                }
                ... etc.
            ]
        }
    ]
}

我必须使用(作为示例)此模板展开它:

                {% for key, value in list.items %}
                <ul class="Container">
                    <li class="Node ExpandClosed">
                        <div class="Expand">

                        </div>


                        <div class="Content">
                            <a href="/help/pur/">
                                {{ key }}
                            </a>
                        </div>

                        {% for k, v in value.items %}
                        <ul class="Container">
                            <li class="Node ExpandClosed">
                                <div class="Expand">

                                </div>

                                <div class="Content">
                                    <a href="/help/test/">
                                        {{ k }}
                                    </a>
                                </div>
                                {% for k1, v1 in v.items %}
                                <ul class="Container">
                                        <li class="Node ExpandClosed">
                                            <div class="Expand">

                                            </div>

                                            <div class="Content">
                                                <a href="/help/test/">
                                                    {{ k1 }}
                                                </a>
                                            </div>

                                            {% for k2, v2 in v1.items %}
                                                    <ul class="Container">
                                                        <li class="Node ExpandClosed">
                                                            <div class="Expand">

                                                            </div>

                                                            <div class="Content">
                                                                <a href="#" onclick="k2 = '{{ k2 }}'; changeText(k2)">
                                                                    {{ k2 }}
                                                                </a>
                                                            </div>
                                                        </li>
                                                    </ul>
                                            {% endfor %}
                                        </li>
                                </ul>
                                {% endfor %}
                            </li>
                        </ul>
                        {% endfor %}
                    </li>
                </ul>
                {% endfor %}

我必须将 "name" 属性放入 "a href" 标签,并在开始和结束标签之间提取 "content",对于节点的后代,我想通过它们递归地。不幸的是,考虑到它的局限性,我不知道如何使用 django 模板语言来执行它。

你能帮帮我吗?

Django 可以使用递归模板。如果您创建一个名为(例如)recurse.html 的模板,并通过您的顶级字典向它传递一个 data 变量:

<ul class="Container">
    <li class="Node ExpandClosed">

        <div class="Expand"></div>

        <div class="Content">
            <a href="{{data.name}}">
                {{data.content}}
            </a>
        </div>

        {% for item in data.decendent %}
            {% include 'recurse.html' with data=item %}
        {% endfor %}

    </li>
</ul>

应该在第一层显示,然后每次都重新调用自己,因为它 decendents 并且 data 重新绑定到新的子树。

我宁愿为 Jinja2 模板创建一个新标签。 Django-doc reference