jinja2 рекурсивный цикл против словаря - PullRequest
8 голосов
/ 10 декабря 2011

У меня есть следующий словарь:

{'a': {'b': {'c': {}}}}

И следующий шаблон Jinja2:

            {% for key in dictionary recursive %}

            <li>{{ key }}
            {% if dictionary[key] %}
                <ul>{{ loop(dictionary[key]) }}</ul>
            {% endif %}
            </li>

        {% endfor %}

Но Jinja2 всегда выводит:

<ul>
    <li>a</li>
    <ul>
        <li>b</li>
    </ul>
</ul>

Я понялчто при использовании рекурсии, он также покажет мне элемент "c", но он работает только для глубины 2. Почему dictionary не меняется на dictionary[key] на каждой итерации цикла?dictionary всегда является оригиналом dictionary.

Ответы [ 2 ]

9 голосов
/ 10 декабря 2011

Вы правы, dictionary не обновляется в рекурсивных вызовах, и цикл не может быть продолжен, поскольку ключи не найдены.

Временное решение этой проблемы - использование только переменных, назначенных в цикле for. В примере словаря это означает перебирать элементы словаря, а не только ключи:

from jinja2 import Template

template = Template("""                                                     
{%- for key, value in dictionary.items() recursive %}                       
  <li>{{ key }}                                                             
    {%- if value %}                                                         
      Recursive {{ key }}, {{value}}                                        
      <ul>{{ loop(value.items())}}</ul>                                     
    {%- endif %}                                                            
  </li>                                                                     
{%- endfor %}                                                               
""")

print template.render(dictionary={'a': {'b': {'c': {}}}})

Вывод этого скрипта:

<li>a
    Recursive a, {'b': {'c': {}}}
    <ul>
<li>b
    Recursive b, {'c': {}}
    <ul>
<li>c
</li></ul>
</li></ul>
</li>

, где вы можете видеть, что рекурсия на ключе b работает нормально, потому что key и value обновляются на каждой итерации цикла (я добавил сообщение "Значение рекурсивного ключа, значение" в шаблон, чтобы сделать это понятно).

0 голосов
/ 10 декабря 2011

попробуйте что-то вроде этого:

    {% for key in dictionary recursive %}

        <li>{{ key }}
        {% if dictionary[key] %}
            <ul>{{ loop(dictionary[key].keys()) }}</ul>
        {% endif %}
        </li>

    {% endfor %}

Я думаю, вам нужно передать итерацию в конструкцию loop().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...