2012-03-08 4 views
7

Nie jestem pewien, czy to, co chcę zrobić, jest możliwe: Próbuję uzyskać blok w szablonie nadrzędnym, który zostanie wypełniony przez plik zawarty w szablonie podrzędnym rodzica.Użyj bloków z dołączonych plików dla rodzica w jinja2

Najlepszym sposobem, aby wyjaśnić, że jest to przypadek testowy:

pliku 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> 

pliku t2.djhtml:

{% extends 't1.djhtml' %} 

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

pliku t3 .djhtml:

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

pliku test.py:

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

Wyjście jest:

<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> 

Blok t2 powinna być pusta, a t3_container powinien mieć treść t3 blok jest w środku. Jak to zrobić?

Odpowiedz

4

Aby odpowiedzieć na własne pytanie, możesz użyć makr w dołączonym pliku, ale zamiast go włączyć, importujesz makra z kontekstem.

//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

Dziękujemy za powrót i dodanie rozwiązania @Richard! To rozwiązanie działało świetnie i właśnie uratowało moją noc – gtalarico