2010-08-03 2 views

Antwort

34

Da der Kontext nicht als benanntes Wörterbuch übergeben wird, ist ein wenig Arbeit erforderlich, um eine Liste der Kontextvariablen aus einer Vorlage zu erstellen. Es ist jedoch möglich.

  1. definieren Jinja context function das jinja2.Context Objekt zurück, das im Wesentlichen ein Wörterbuch der globalen Variablen ist/Funktionen

  2. Sie sich, dass Funktion im globalen Namensraum zur Verfügung; d. h. ein jinja2.Environment- oder jinja2.Template-globals-Wörterbuch

  3. Optional können Sie Objekte aus dem Kontext filtern; Verwenden Sie zum Beispiel callable(), um Jinjas globale Hilfsfunktionen (Bereich, Joiner usw.) zu überspringen. Dies kann in der Kontextfunktion oder der Vorlage erfolgen; wo auch immer es am sinnvollsten ist.

Beispiel:

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

[Alternativ render_response mit ('home.htm', context=context) rufen die andere Lösung funktioniert.]

+4

Vielen Dank. Ich verneige mich vor deinem überlegenen Jinja2-Wissen. – Christian

+0

Beachten Sie, dass Ihre Lösung aufgrund der "aufrufbaren" Prüfung Funktionen ignoriert, die explizit als Teil des Kontextes übergeben wurden. Wahrscheinlich nicht oft, aber könnte einen Unterschied machen. –

+1

Wahr. Diese einfache Lösung kann definitiv verbessert werden. Zum Beispiel, wenn '' template'' ein globales '' get_context() '' ist, kann ein neues Wörterbuch basierend auf '' context'' aber ohne Schlüssel, die auch in '' template.globals' existieren, zurückgeben. – Garrett

1

Hier ist, wie @crewbum's answer Arbeit von einer Flasche App zu bekommen:

import jinja2 

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

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

Wo stellst du das hin? – johnny

+0

In der App-Initialisierung (oder App-Factory). Wenn Sie Flaschenverlängerungen verwenden, wie zum Beispiel flaschen-sqlalchemy, flaschen-login usw., können Sie sich dort befinden, wo sie erstellt wurden. –

Verwandte Themen