2012-03-08 10 views
7

Non sono sicuro se ciò che voglio fare è possibile: sto cercando di ottenere un blocco in un modello padre da compilare da un file incluso in un modello figlio del genitore.Usa blocchi da file inclusi per genitore in jinja2

Il modo migliore per spiegare questo è un banco di prova:

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

File t2.djhtml:

{% extends 't1.djhtml' %} 

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

File t3 .djhtml:

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

File test.py:

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

Il risultato è:

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

Il blocco t2 dovrebbe essere vuoto, e t3_container dovrebbe avere un contenuto di blocchi t3 s' interno. Come posso realizzare questo?

risposta

4

Per rispondere alla mia domanda, è possibile utilizzare macro nel file incluso, ma invece di includerlo, si importano le macro con il contesto.

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

Grazie per essere tornato e aver aggiunto la soluzione @Richard! Questa soluzione ha funzionato benissimo e mi ha appena salvato la notte – gtalarico