Я хотел бы установить значения по умолчанию для переменных, используемых в моем шаблоне Jinja, внутри самого шаблона. Глядя на документацию Jinja2, я не вижу способа сделать это. Я что-то упустил? Я вижу фильтр "по умолчанию", но я хочу установить широкий шаблон значения, а не использовать по мере использования.
Я потратил час или около того, пытаясь научить себя процессу написания расширения Jinja2, чтобы написать тег расширения setdefault
, который мог бы выглядеть следующим образом:
{% setdefault animal = 'wumpas' %}
Желаемый эффект был бы эквивалентен тегу set
, если назначенное имя не было определено, но не имел никакого эффекта, если назначенное имя было определено. Я до сих пор не смог заставить это работать.
Моя работа - полностью обойти jinja и создать составной файл; область перед специальным маркером - это отображение значений по умолчанию (yaml), а область после маркера - это шаблон jinja. Доказательство концептуальной реализации этого, которая, похоже, работает нормально:
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')
Итак, есть ли способ сделать эквивалент в стандартном Jinja2, или как можно написать расширение для достижения желаемого эффекта?