如果对象是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'
答案 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)
答案 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
函数,并将其放在globals
和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>
答案 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'
答案 10 :(得分:-2)
您可以简单地将“default none”添加到您的变量中,如下所述:
{{ your_var | default('NONE', boolean=true) }}