2011-12-09 3 views
8

Я следующий словарь:jinja2 рекурсивный цикл против словаря

{'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.

ответ

9

Вы правы, 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

попробовать что-то вроде этого:

{% for key in dictionary recursive %} 

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

    {% endfor %} 

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

+0

Та же проблема продолжается = ( – Tarantula

Смежные вопросы