Jinja2模板变量如果无对象设置了默认值

时间:2013-10-27 02:31:02

标签: jinja2

如果对象是None而不是做这样的事情,如何使jijna2中的变量默认为“”?

      {% if p %}   
        {{ p.User['first_name']}}
      {% else %}
        NONE
      {%endif %}

因此,如果对象p为None,我想将p(first_name和last_name)的值默认为“”。 基本上     nvl(p.User [first_name'],“”)

收到错误:  错误:jinja2.exceptions.UndefinedError UndefinedError:'None'没有属性'User'

11 个答案:

答案 0 :(得分:184)

使用none内置函数(http://jinja.pocoo.org/docs/templates/#none):

{% if p is not none %}   
    {{ p.User['first_name'] }}
{% else %}
    NONE
{%endif %}

{{ p.User['first_name'] if p != None else 'NONE' }}

或者如果你需要一个空字符串:

{{ p.User['first_name'] if p != None }}

答案 1 :(得分:101)

{{p.User['first_name'] or 'My default string'}}

答案 2 :(得分:54)

根据docs,您可以这样做:

{{ p|default('', true) }}

导致None在布尔上下文中转换为False


更新:正如lindes所提到的,它仅适用于简单数据类型。

答案 3 :(得分:20)

作为对其他答案的补充,如果变量是None,则可以写出其他内容:

{{ variable or '' }}

答案 4 :(得分:7)

关注this doc,您可以这样做:

{{ p.User['first_name']|default('NONE') }}

答案 5 :(得分:3)

为避免在“p”或“p.User”为“无”时抛出异常,您可以使用:

{{ (p and p.User and p.User['first_name']) or "default_value" }}

答案 6 :(得分:1)

作为另一种解决方案(类似于以前的解决方案):

{{ ( p is defined and p.User is defined and p.User['first_name'] ) |default("NONE", True) }}

请注意,最后一个变量(p.User ['first_name'])之后没有经过if defined测试。

答案 7 :(得分:0)

我通常定义一个nvl函数,并将其放在globalsfilters中。

def nvl(*args):
    for item in args:
        if item is not None:
            return item
    return None

app.jinja_env.globals['nvl'] = nvl
app.jinja_env.filters['nvl'] = nvl

模板中的用法:

<span>Welcome {{ nvl(person.nick, person.name, 'Anonymous') }}<span>

// or 

<span>Welcome {{ person.nick | nvl(person.name, 'Anonymous') }}<span>

答案 8 :(得分:0)

从Ansible 2.8开始,您可以使用:

{{ p.User['first_name'] }}

请参见https://docs.ansible.com/ansible/latest/porting_guides/porting_guide_2.8.html#jinja-undefined-values

答案 9 :(得分:0)

使用 ChainableUndefined,您可以做到这一点。

>>> import jinja2
>>> env = jinja2.Environment(undefined=jinja2.ChainableUndefined)
>>> env.from_string("{{ foo.bar['baz'] | default('val') }}").render()
'val'

source

答案 10 :(得分:-2)

您可以简单地将“default none”添加到您的变量中,如下所述:

{{ your_var | default('NONE', boolean=true) }}