Разумный способ определить значения переменных по умолчанию из шаблона jinja?

Я хотел бы установить значения по умолчанию для переменных, используемых в моем шаблоне 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, или как можно написать расширение для достижения желаемого эффекта?

12
задан Matt Anderson 18 December 2010 в 19:26
поделиться