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?
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. –