2012-03-08 24 views
7

No estoy seguro de si lo que quiero hacer es posible: estoy tratando de obtener un bloque en una plantilla primaria para que se complete con un archivo incluido en una plantilla secundaria del padreUsar bloques de archivos incluidos para padres en jinja2

La mejor manera de explicar esto es un caso de prueba:

Archivo t1.djhtml:

<root> 
    <block t3_container> 
     {% block t3 %}This should be 'CONTENT'{% endblock %} 
    </block t3_container> 

    <block t2_container> 
    {% block t2 %}{% endblock %} 
    </block t2_container> 
</root> 

Archivo t2.djhtml:

{% extends 't1.djhtml' %} 

{% block t2 %} 
     <block t2> 
      {%- include 't3.djhtml' with context %} 
     </block t2> 
{% endblock %} 

Archivo t3 .djhtml:

{% block t3 %} 
     <block t3> 
      CONTENT 
     </block t3> 
{% endblock %} 

Archivo test.py:

from jinja2 import Environment, FileSystemLoader 
env = Environment(loader=FileSystemLoader('')) 
t=env.get_template('t2.djhtml') 
print t.render() 

La salida es:

<root> 
    <block t3_container> 
     This should be 'CONTENT' 
    </block t3_container> 

    <block t2_container> 

     <block t2> 
     <block t3> 
      CONTENT 
     </block t3> 

     </block t2> 

    </block t2_container> 
</root> 

t2 El bloque debe estar vacío, y t3_container debe tener un contenido t3 de bloques que hay dentro. ¿Cómo logro esto?

Respuesta

4

Para responder a mi propia pregunta, puede usar macros en el archivo incluido, pero en lugar de incluirlo, importe las macros con contexto.

//File T1 
<root> 
    <block t3_container> 
    {% block t3 %}{% endblock %} 
    </block t3_container> 

    <block t2_container> 
    {% block t2 %}{% endblock %} 
    </block t2_container> 
</root> 

// File T2 
{% extends 't1.djhtml' %} 
{%- from 't3.djhtml' import inner, inner2 with context %} 

{% block t3 %} 
    {{inner2()}} 
{% endblock %} 

{% block t2 %} 
    <block t2> 
     {{ inner() }} 
    </block t2> 
{% endblock %} 

// File T3 
{% macro inner2() %} 
    <block t3> 
     CONTENT '{{foo+1}}' 
    </block t3> 
{% endmacro %} 

{% macro inner() %} 
    hello 
{% endmacro %} 

// test.py 
from jinja2 import Environment, FileSystemLoader 
env = Environment(loader=FileSystemLoader('')) 
t=env.get_template('t2.djhtml') 
print t.render({ 'foo' : 122 }) 
+0

Gracias por regresar y agregar su solución @Richard! Esta solución funcionó muy bien y me salvó la noche – gtalarico

Cuestiones relacionadas