2010-12-18 7 views
8

Ich möchte Standardwerte für Variablen, die in meiner Jinja-Vorlage verwendet werden, innerhalb der Vorlage selbst festlegen. Wenn ich mir die Jinja2-Dokumentation anschaue, sehe ich keinen Weg, dies zu tun. Habe ich etwas verpasst? Ich sehe den "Standard" -Filter, aber ich möchte die Wertvorlage breit anstelle von Verwendung nach Verwendung festlegen.Sane Möglichkeit, Standardvariablenwerte innerhalb einer jinja Vorlage zu definieren?

ich eine Stunde lang oder so versucht, mich genug über den Prozess Jinja2 Verlängerung Schreiben zu lehren, eine Verlängerung Tag setdefault, zu schreiben, die wie folgt aussehen könnte:

{% setdefault animal = 'wumpas' %} 

Der gewünschte Effekt auf die set wäre gleichbedeutend Tag, wenn der zugewiesene Name nicht definiert ist, aber keine Auswirkung hat, wenn der zugewiesene Name definiert wurde. Ich habe es bisher nicht geschafft, dies zur Arbeit zu bringen.

Meine Arbeit besteht darin, Jinja vollständig zu umgehen und eine zusammengesetzte Datei zu erstellen; Der Bereich vor einer speziellen Markierung ist eine (yaml) Zuordnung von Standardwerten und der Bereich nach einer Markierung ist die jinja Vorlage. Ein Proof of Concept Umsetzung dieser, die zu funktionieren scheint, ist:

skel_text = """\ 
animal: wumpas 
%% 
The car carried my {{animal}} to the vet. 
""" 
class Error(Exception): pass 
_skel_rx = re.compile(
    r"""((?P<defaults>.*?)^%%[ \t]*\n)?(?P<template>.*)""", 
    re.MULTILINE|re.DOTALL) 
_env = jinja2.Environment(trim_blocks=True) 
def render(skel, **context): 
    m = _skel_rx.match(skel_text) 
    if not m: 
     raise Error('skel split failed') 
    defaults = yaml.load(m.group('defaults') or '{}') 
    template = _env.from_string(m.group('template') or '') 
    template.globals.update(defaults) 
    return template.render(**context) 

print render(skel_text) 
print render(skel_text, animal='cat') 

So ist es eine Möglichkeit, das Äquivalent auf Lager Jinja2 zu tun, oder wie könnte man eine Erweiterung schreiben die gewünschte Wirkung zu erreichen?

Antwort

11

Die set control structure können tun, was Sie wollen.

Hier ist ein Code I-Test verwendet:

from jinja2 import Template 
t = '''{% set name=name or "John Doe" %}Hello {{ name }}''' 
template = Template(t) 
print template.render(name='Jonnie Doe') 
print template.render() 

Wie erwartet, gibt sie:

Hello Jonnie Doe 
Hello John Doe 
+0

Es ist nicht genau das, was ich mir erhofft hatte, aber ich gebe zu, dass es mir nicht in den Sinn gekommen war. Hört sich gut an. –

21

Was war für mich gearbeitet, einen Filter zu verwenden:

t = '''Hello {{name | default('John Doe')}}''' 
+1

'default' wurde für genau diesen Zweck erstellt und sollte die akzeptierte Antwort sein, IMHO. Ein anderes Idiom ist die Verwendung von 'default' in Verbindung mit' set' am oberen Rand Ihrer Vorlagen. ala '{% set name = name | default ('John Doe')%}'. Jetzt können Sie "name" frei in Ihrer Vorlage verwenden, ohne befürchten zu müssen, dass sie nicht definiert ist. – Dave

Verwandte Themen