199

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

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

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

nvl(p.User[first_name'], "")

接收错误:

Error:  jinja2.exceptions.UndefinedError
    UndefinedError: 'None' has no attribute 'User'
4

12 回答 12

326

使用none测试(不要与 Python 的None对象混淆!):

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

或者:

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

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

{{ p.User['first_name'] if p is not none }}
于 2013-10-27T08:28:01.757 回答
154
{{p.User['first_name'] or 'My default string'}}
于 2014-06-24T11:46:59.447 回答
95

根据文档,您可以这样做:

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

导致在布尔上下文中None强制转换。False

于 2015-03-23T19:04:05.817 回答
47

作为其他答案的补充,如果 variable 是 None ,则可以写其他东西,如下所示:

{{ variable or '' }}
于 2017-02-05T19:25:32.713 回答
14

按照这个文档,你可以这样做:

{{ p.User['first_name']|default('NONE') }}
于 2014-06-03T18:15:13.167 回答
7

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

{{ (p and p.User and p.User['first_name']) or "default_value" }}
于 2017-10-25T10:14:54.463 回答
1

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

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

资源

于 2021-08-05T08:00:24.013 回答
0

如果您想设置自己的默认值而不是 None 而不是简单地这样做

{{your_var|default:'default name'}}

于 2021-09-22T06:24:11.990 回答
0

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

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

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

于 2019-05-02T19:59:21.257 回答
-1

我通常定义一个nvl函数,并将其放入globalsand中filters

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>
于 2018-03-12T13:18:21.757 回答
-1

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

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

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

于 2019-06-15T14:59:03.957 回答
-2

You can simply add "default none" to your variable as the form below mentioned:

{{ your_var | default('NONE', boolean=true) }}
于 2020-12-29T07:40:59.550 回答