Рекурсивная навигация по словарю в шаблоне 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)
Больше информации можно найти в документации.