2010-08-03 4 views

risposta

34

Tecnicamente, perché contesto non viene passato come un dizionario di nome, un po 'di lavoro è necessario per generare un elenco delle variabili di contesto all'interno di un modello. È possibile però.

  1. Definire un Jinja context function per restituire l'oggetto jinja2.Context, che è essenzialmente un dizionario delle variabili globali/funzioni

  2. rendere tale funzione disponibile nello spazio dei nomi globale; cioè un dizionario globals jinja2.Environment o jinja2.Template

  3. Facoltativamente, oggetti filtro dal contesto; ad esempio, utilizzare callable() per ignorare le funzioni di supporto globali predefinite di Jinja (intervallo, joiner, ecc.). Questo può essere fatto nella funzione di contesto o nel modello; ovunque abbia più senso.

Esempio:

>>> import jinja2 
>>> 
>>> @jinja2.contextfunction 
... def get_context(c): 
...   return c 
... 
>>> tmpl = """ 
... {% for key, value in context().items() %} 
...  {% if not callable(value) %} 
...   {{ key }}:{{ value }} 
...  {% endif %} 
... {% endfor %} 
... """ 
>>> 
>>> template = jinja2.Template(tmpl) 
>>> template.globals['context'] = get_context 
>>> template.globals['callable'] = callable 
>>> 
>>> context = {'a': 1, 'b': 2, 'c': 3} 
>>> 
>>> print(template.render(**context)) 
     a:1 
     c:3 
     b:2 

[In alternativa, chiamare render_response con ('home.htm', context=context) per rendere gli altri lavori soluzione.]

+4

Grazie mille. Mi inchino alla tua superiore conoscenza di Jinja2. – Christian

+0

Si noti che a causa del controllo 'callable', la soluzione ignorerebbe le funzioni che sono state esplicitamente passate come parte del contesto. Probabilmente non succede spesso, ma potrebbe fare la differenza. –

+1

Vero. Questa semplice soluzione può sicuramente essere migliorata. Per esempio, se '' template'' è una società globale, '' GET_CONTEXT() '' può restituire un nuovo dizionario in base a '' context'' ma senza chiavi che esistono anche in '' template.globals''. – Garrett

1

Ecco come ottenere @crewbum's answer lavoro da un'applicazione Flask:

import jinja2 

@jinja2.contextfunction 
def get_context(c): 
    return c 

app.jinja_env.globals['context'] = get_context 
app.jinja_env.globals['callable'] = callable 
+0

Dove lo metti? – johnny

+0

Nell'inizializzazione dell'app (o nella factory dell'app). Se si usano estensioni di una bottiglia, come flask-sqlalchemy, flask-login, ecc., Questo può essere nello stesso posto in cui sono stati creati. –

Problemi correlati