2010-12-18 3 views
8

Chciałbym ustawić wartości domyślne dla zmiennych używanych w moim szablonie Jinja wewnątrz samego szablonu. Patrząc na dokumentację Jinja2, nie widzę żadnego sposobu, aby to zrobić. Czy coś przeoczyłem? Widzę filtr "domyślny", ale chcę ustawić szablon wartości szeroki, a nie jako parametr "use-by-use".Zdrowy sposób definiowania domyślnych wartości zmiennych z szablonu jinja?

spędziłem godzinę albo tak próbuje nauczyć się wystarczająco dużo o procesie pisania rozszerzenie Jinja2 napisać tag wewnętrzny setdefault, która mogłaby wyglądać następująco:

{% setdefault animal = 'wumpas' %} 

pożądany efekt byłby odpowiednikiem set znacznik, jeśli przypisana nazwa była niezdefiniowana, ale nie miała żadnego efektu, jeśli zdefiniowana nazwa została zdefiniowana. W ten sposób nie udało mi się sprawić, by to zadziałało.

Moja praca polega na całkowitym obejściu jinji i złożeniu pliku złożonego; obszar przed specjalnym znacznikiem jest mapowaniem (yaml) wartości domyślnych, a obszar po markerze jest szablonem jinja. Dowód wykonania koncepcji tego, co wydaje się działać prawidłowo jest:

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

Więc, czy jest jakiś sposób aby zrobić równowartość w stanie Jinja2, lub jak można napisać rozszerzenie osiągnąć pożądany efekt?

Odpowiedz

11

set control structure może zrobić, co chcesz.

Oto kod użyłem do testu:

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

Zgodnie z oczekiwaniami, to wyjść:

Hello Jonnie Doe 
Hello John Doe 
+0

Nadszedł nie dokładnie to, na co liczyłem, ale przyznaję, że robienie tego w ten sposób nie przyszło mi do głowy. Brzmi dobrze. –

21

Co pracował dla mnie było użyć filtru:

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

'default' został stworzony właśnie w tym celu i powinien być zaakceptowaną odpowiedzią, IMHO. Innym idiomem jest użycie 'default' w połączeniu z' set' na górze twoich szablonów. ala '{% set name = name | default ('John Doe')%}'. Teraz możesz swobodnie używać słowa "nazwa" w swoim szablonie bez obawy, że nie będzie ono niezdefiniowane. – Dave