Вложенные словари и шаблон Django - PullRequest
0 голосов
/ 30 октября 2010

При наличии словаря:

menu = {'title': 'Link1',
        'children': {'title': 'Child of Link1',
                     'children': #etc..}
        }

Как можно выполнить итерацию, чтобы получить результат:

<ul>
    <li>Link1
    <ul>
        <li>Child of Link 1
            <ul>
               <li>Grandchild of Link 1
               <ul>etc..</ul>
               </li>
             </ul>
         </li>
     </ul>
     </li>
</ul>

В настоящее время я использую это, но, очевидно, оно уходит на глубину единицы.

    <ul id="mainnavigation">     
    {% for k,v in admin.items %} #ContextProcessor, because this menu needs to know the current path.
            <li class="expandable"><a href="{{ v.path }}">{{ v.title }}</a>
                {% if v.children != None %}
                    <ul>
                    {% for id,child in v.children.items %}
                            <li class="expandable"><a href="{{ child.path }}">{{ child.title }}</a></li>
                    {% endfor %}
                    </ul>
                {% endif %}
            </li>
    {% endfor %}
</ul>

Одним из способов было бы вручную повторить цикл для каждого уровня, однако такое решение уродливо, и я надеюсь, что есть более СУХОЙ.

Ответы [ 2 ]

1 голос
/ 30 октября 2010

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

Итак, это будет:

menu = (Link 1 (Child of Link 1 (Grandchild of Link 1 (...) )))

и

<ul id="mainnavigation">
  {{ menu|unordered_list }}
</ul>
1 голос
/ 30 октября 2010

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

{% for k,v in var %}
{% my_tag v.children %}
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...