2014-07-18 10 views
14

voglio avere un template padre e molti bambini modelli con le proprie variabili che passano al genitore, in questo modo:variabili passare da template figlio a genitore in Jinja2

Parent.html:

{% block variables %} 
{% endblock %} 

{% if bool_var %} 
    {{ option_a }} 
{% else %} 
    {{ option_b }} 
{% endif %} 

child.html:

{% extends "parent.html" %} 

{% block variables %} 
    {% set bool_var = True %} 
    {% set option_a = 'Text specific to this child template' %} 
    {% set option_b = 'More text specific to this child template' %} 
{% endblock %} 

ma le variabili finiscono indefinito nel genitore.

risposta

15

Ah. Apparentemente non saranno definiti quando saranno passati attraverso i blocchi. La soluzione è quella di rimuovere solo i tag di blocco e configurarlo in questo modo:

Parent.html:

{% if bool_var %} 
    {{ option_a }} 
{% else %} 
    {{ option_b }} 
{% endif %} 

child.html:

{% extends "parent.html" %} 

{% set bool_var = True %} 
{% set option_a = 'Text specific to this child template' %} 
{% set option_b = 'More text specific to this child template' %} 
+0

mio 'Parent.html 'non ci fa direttamente e il mio 'bool_var', ma ha piuttosto un'istruzione' include' che include un altro modello che usa 'bool_var'. In questo modello incluso la variabile stava uscendo indefinita finché nel file 'parent.html' ho usato la variabile come' {{bool_var}} 'o ho fatto il tautologico' {% set bool_var = bool_var%} '. – tremby

0

Se la soluzione di Nathron non risolve il problema , puoi usare una funzione in combinazione con una variabile python globale per passare un valore variabile.

  • Vantaggio: il valore della variabile sarà disponibile in tutti i modelli. È possibile impostare la variabile all'interno di un blocco.
  • Svantaggio: Altro sovraccarico.

Questo è quello che ho fatto:

child.j2:

{{ set_my_var('new var value') }} 

base.j2

{% set my_var = get_my_var() %} 

codice Python

my_var = '' 


def set_my_var(value): 
    global my_var 
    my_var = value 
    return '' # a function returning nothing will print a "none" 


def get_my_var(): 
    global my_var 
    return my_var 

# make functions available inside jinja2 
config = { 'set_my_var': set_my_var, 
      'get_my_var': get_my_var, 
      ... 
     } 

template = env.get_template('base.j2') 

generated_code = template.render(config) 
Problemi correlati