2011-12-09 24 views
8

Tengo el siguiente diccionario:Jinja2 bucle recursivo vs diccionario

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

Y la siguiente plantilla Jinja2:

  {% for key in dictionary recursive %} 

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

     {% endfor %} 

Pero Jinja2 siempre de salida:

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

mi entender es que usando recursivo, me mostraría el elemento "c" también, pero solo funciona para una profundidad de 2. ¿Por qué es dictionary sin cambiar a dictionary[key] en cada iteración de ciclo? El dictionary es siempre el dictionary original.

Respuesta

9

Tiene razón, dictionary no se está actualizando en las llamadas de recursión, y el ciclo no puede continuar porque las claves no se encuentran.

Una solución alternativa a este problema es utilizar solo las variables asignadas en el ciclo for. En el ejemplo de diccionario, esto significa para recorrer los elementos del diccionario en lugar de sólo las teclas:

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': {}}}}) 

La salida de este script es:

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

donde se puede ver que la recursividad en el La clave b funciona bien porque ambos key y value se actualizan en cada iteración del ciclo (agregué el mensaje "Clave recursiva, valor" a la plantilla para dejarlo en claro).

0

intentar algo como esto:

{% for key in dictionary recursive %} 

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

    {% endfor %} 

creo que necesita para pasar un iterable en el loop() constructo.

+0

El mismo problema continúa = ( – Tarantula

Cuestiones relacionadas