Django模板标签递归一个嵌套字典



这是对从dropbox API构建目录树的后续操作

我已经把字典整理好了,这正是我想要的。但现在我想写一个模板标签把这个嵌套结构写成html格式,比如:
<ul>
    <li>
        Dir/
        <ul>
            <li>
                Dir2/
                ...
            </li>
            <li>Inner File</li>
        </ul>
    </li>
    <li>File1</li>
    <li>File2</li>
</ul>

我所能想到的是一个递归生成器,它可以得到文件和目录,我可以把它们放在一个平面列表中,但是我不知道如何让嵌套工作,以及如何把html放在正确的位置。

def recurse(d):
    for key, value in d.items():
        if value['contents']:
            for inner_key, inner_value in recurse(value['contents']):
                yield inner_key, inner_value
        else:
            yield key, value

模板标签:

@register.simple_tag()
def dropbox_files():
    files = function_from_other_question()
    s = '<ul>'
    for key, value in recurse(files):
        s += '<li>{}</li>'.format(key)
    s += '</ul>'
    return s

这得到了所有的路径,但正如我所说的,没有任何嵌套结构。

您可以使用模板包括:

recurse_dict.html

{% if dict and dict.keys|length > 0 %}
<ul>
    {% for key, value in dict.items %}
        <li>
            {% if value and value.keys|length > 0 %}
               {{ key }} {% include "recurse_dict.html" with dict=value %}
            {% else %}
               {{ value }}
            {% endif %}
        </li>
    {% endfor %}
</ul>
{% endif %}

最新更新