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

问题描述 投票:0回答:13

如果对象是

None
,如何使 Jijna2 中的变量默认为“”,而不是执行类似的操作?

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

所以如果对象

p
None
。我想将
p
(名字和姓氏)的值默认为
""
。 基本上:

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

接收错误:

错误:jinja2.exceptions.UndefinedError
未定义错误:“无”没有属性“用户”

jinja2
13个回答
406
投票

使用

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 }}

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

108
投票

根据docs你可以这样做:

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

因为

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


58
投票

除了其他答案之外,如果变量为 None ,还可以写一些其他内容,如下所示:

{{ variable or '' }}

23
投票

按照此文档,您可以这样做:

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

7
投票

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

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

7
投票

有了

ChainableUndefined
,你就可以做到。

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

来源


1
投票

如果您想设置自己的默认值而不是“无”,只需这样做

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


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>

0
投票

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

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

注意最后一个变量 (p.User['first_name']) 后面没有

if defined
测试。


0
投票

我通过定义自定义过滤器解决了这个问题(在我的例子中,我需要在

None
、False 或空字符串的情况下):

def __default_if_empty(value, default) :
    """Returns a default value if the given value evaluates to False."""
    return value if value else default

env = Environment(
    # Your config...
)
env.filters["default_if_empty"] = __default_if_empty

然后在模板中使用该过滤器:

{{ your_var | default_if_empty('') }}

-2
投票

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

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

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


-2
投票

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

{{ your_var | default('NONE', boolean=true) }}
© www.soinside.com 2019 - 2024. All rights reserved.