Разумный способ определить значения переменных по умолчанию из шаблона jinja? - PullRequest
11 голосов
/ 18 декабря 2010

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

Ответы [ 2 ]

24 голосов
/ 29 октября 2013

Что мне помогло, так это использование фильтра:

t = '''Hello {{name | default('John Doe')}}'''
13 голосов
/ 18 декабря 2010

Структура управления set может делать то, что вы хотите.

Вот код, который я использовал для тестирования:

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

Как и ожидалось, он выводит:

Hello Jonnie Doe
Hello John Doe
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...