Рекурсивная навигация по словарю в шаблоне django

У меня есть словарь неизвестной глубины, который я хочу отобразить в шаблоне Django. Этот словарь представляет структуру вложенных папок внутри папки. Моя цель - отобразить его с родительскими вложенными папками перед их дочерними, которые будут отступать, чтобы показать, что они являются дочерними для этой папки.

Чтобы объяснить на примере, если у меня есть следующий словарь :

{'Script Hello': 
    {'Script Hello World': 
        {'Script Hello World 2': None, 
         'Script Hello World 3': None}}, 
 'Script Hello World 4': None, 
 'Script Hello World 5': 
    {'Script Hello World 6': None}}

Я хочу, чтобы он отображался следующим образом :

. Script Hello
    . Script Hello World
        . Script Hello World 2
        . Script Hello World 3

. Script Hello World 4

. Script Hello World 5
    . Script Hello World 6

Я сделал небольшой код, который выполняет эту работу, если глубина не более 3 (чтобы определить, что я действительно хотел), но не смог найти способ сделать его рекурсивным.

Мой код таков :

{% for key, values in list.items %}
    <li> {{ key }}
        <ul>
            {% for key,values in values.items %}
                <li>{{ key }}</li>
                    <ul>
                        {% for key,values in values.items %}
                            <li>{{ key }}</li>
                        {% endfor %}
                    </ul>
            {% endfor %}
        </ul>
    </li>
{% endfor %}

Я пытался использовать js, чтобы сделать быструю функцию для навигации по моему словарю и отображения его содержимого, однако я не смог найти, как получить мой словарь как есть в моей js функции, я всегда получал его экранированным и не мог использовать его, даже после того, как попробовал такие решения, как вот это .

<

Заранее спасибо

Я думаю, что самое простое решение - использовать пользовательский тег шаблона:

from django.utils.safestring import mark_safe

def get_data(data):
    text = "<ul>"
    for k, v in data.items():
       text += f'<li>{k}<li>'
       if isinstance(v, dict):
           text += get_data(v)  # recursively calling to get the lists
       else:  # this else block can be removed if you don't need it
           text += f'<li>{v}</li>'
    text += "</ul>"
    return text
       

@register.filter(is_safe=True)
def render_dict(data):
    text = get_data(data)
    return mark_safe(text)

Больше информации можно найти в документации.

Вернуться на верх