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


145

如果object为None,那么如何在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'

1
使返回值的函数p永不返回None。代替None该函数的是,应返回具有与真实对象相同结构的代理对象,但该代理对象会加载所需的默认值。
Miguel 2013年

我使用了它,但问题得到解决:{%if p!= None%} {{p.User ['first_name']}} {%endif%}
Mona Mohamadinia

Answers:


241

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

19
请注意none答案中的小写字母。我纠正了None的情况后,问题得到解决。
哈珀维尔


70

根据文档,您可以执行以下操作:

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

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


更新:如lindes所述,它仅适用于简单数据类型。


5
这适用于一个简单的变量,但不适用于您要从更复杂的字段中获取字段的问题。我对此表示反对,因为这不是对原始问题的好答案……而与此同时,知道default我的具体情况正是我所需要的,所以……根本就不投票。(对此答案的修改很可能会赢得好评,但我认为可能很难应用于default这种情况)
lindes



5

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

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

4
鉴于我的变量被深深地埋在字典中,因此这是唯一对我有用的方法。
Craicerjack

这有助于清理具有很多逻辑的其他内容。
eagle33322 '19

1

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

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

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


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>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.