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

mcd*_*mcd 119 jinja2

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

      {% if p %}   
        {{ p.User['first_name']}}
      {% else %}
        NONE
      {%endif %}
Run Code Online (Sandbox Code Playgroud)

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

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

tbi*_*icr 203

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

{% if p is not none %}   
    {{ p.User['first_name'] }}
{% else %}
    NONE
{%endif %}
Run Code Online (Sandbox Code Playgroud)

要么

{{ p.User['first_name'] if p != None else 'NONE' }}
Run Code Online (Sandbox Code Playgroud)

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

{{ p.User['first_name'] if p != None }}
Run Code Online (Sandbox Code Playgroud)

  • 请注意答案中的小写"无".在我纠正了无的情况后,我的问题得到了解决. (14认同)
  • 这是最好的答案,因为很多其他人不区分“False”和“None”。此示例使用术语“first_name”,我们可以假设其值不会为“False”,但在很多情况下,系统需要以不同方式对待“False”和“None”。像 `{{p.User['first_name'] or 'default'}}` 这样的东西不会捕获这种情况,并且会错误地将 `False` 转换为默认情况。其他有趣的情况是 `0`、`[]` 和 `""`。 (5认同)

小智 114

{{p.User['first_name'] or 'My default string'}}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的答案-尽可能简洁,并且非常Pythonic。 (2认同)

mit*_*nka 63

根据文档你可以做:

{{ p|default('', true) }}
Run Code Online (Sandbox Code Playgroud)

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


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

  • 这适用于一个简单的变量,但不适用于这个问题,你想要从一个更复杂的领域中获取一个领域.我会赞成这一点,因为它对原始问题不是一个好的答案......但与此同时,了解"默认"正是我所需要的特殊情况,所以......根本就不投票.(对这个答案的编辑很可能会得到一个upvote,除了我认为很难在这种情况下应用`default`) (3认同)

Iva*_*hin 24

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

{{ variable or '' }}
Run Code Online (Sandbox Code Playgroud)

  • 我很惊讶这简单!Python的`x或y`是`如果x是假,那么y,否则是x`.见:5.2.布尔运算 - 和,或者不是](https://docs.python.org/2/lraryrary/stdtypes.html#boolean-operations-and-or-not) (2认同)

paw*_*318 7

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

{{ p.User['first_name']|default('NONE') }}
Run Code Online (Sandbox Code Playgroud)

  • 我不这么认为 - 如果值未定义/缺失,"默认"模板过滤器将返回默认值. (7认同)

小智 7

有了ChainableUndefined,您就可以做到这一点。

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

来源


Sub*_*Sub 5

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

{{ (p and p.User and p.User['first_name']) or "default_value" }}
Run Code Online (Sandbox Code Playgroud)

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