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