Django — создать вложенный html-список из списка объектов словаря

#python #django #django-templates

#python #django #django-шаблоны

Вопрос:

У меня есть список словаря Python в форме, например

 [{'Parent':'top', 'Child':'obj1', 'Level':0},
 {'Parent':'obj1', 'Child':'obj2', 'Level':1},
 {'Parent':'obj1', 'Child':'obj3', 'Level':1},
 {'Parent':'obj2', 'Child':'obj4', 'Level':2},
 {'Parent':'obj4', 'Child':'obj5', 'Level':3}]
  

Я хочу записать это как вложенный HTML-список на основе родительского, например

  • obj1
    • obj2
      • obj4
        • obj5
    • obj3

Как я могу это сделать в шаблоне Django

Комментарии:

1. Зачем вы создаете плоский словарь? Какова «исходная» информация?

2. На самом деле не очень полезный ответ. Можете ли вы обновить вопрос, чтобы отобразить таблицу и запрос? Я подозреваю, что запрос (или модель) можно исправить, чтобы он был правильно вложенным.

Ответ №1:

Быстрое решение:

 def make_list(d):
    def append_children(parent, d):
        children = [[x['Child']] for x in d if x['Parent'] == parent[0]]
        if children:
            parent.append(children)
            for child in children:
                append_children(child, d)

    results = [[x['Child']] for x in d if x['Parent'] == 'top']
    for parent in results:
        append_children(parent, d)

    return results
  

Передайте список в эту функцию, а затем примените unordered_list фильтр к результату. Недостатком этого метода является то, что <ul> список создается даже для одного элемента ( <ul><li>elem</li></ul> ), но вы можете изменять отображение по своему усмотрению с помощью CSS.

Если вы хотите более четкий HTML, вам следует написать для этого пользовательский тег или фильтр.