2010-12-18 42 views
8

我想为模板本身的Jinja模板中使用的变量设置默认值。看着Jinja2文档,我没有看到任何方式来做到这一点。我错过了什么吗?我看到了“默认”过滤器,但我想将值模板设置为宽而不是逐个使用的基础。从jinja模板中定义默认变量值的方法?

我花了一个小时左右的努力够教自己有关的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的股票相当于或如何可能一个写一个扩展来实现预期的效果?

回答

11

set control structure可以做你想做的。

下面是一些代码我用来测试:

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 
+0

这是不完全是我所希望的,但我承认这样做并没有发生在我身上。听起来不错。 – 2010-12-19 15:51:56

21

什么工作对我来说是使用过滤器:

t = '''Hello {{name | default('John Doe')}}''' 
+1

'default'就是为了这个目的而创建的,应该是被接受的答案,恕我直言。另一个习惯用法是在模板的顶部将'default'和'set'结合使用。 ala'{%set name = name | default('John Doe')%}'。现在,您可以在整个模板中自由使用'name',而不用担心它未被定义。 – Dave 2015-12-24 17:34:14