web-dev-qa-db-ja.com

Noneオブジェクトがデフォルト値を設定する場合のJinja2テンプレート変数

オブジェクトがこのようなことをする代わりに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: 'なし'には属性 'ユーザー'がありません

116
mcd

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 }}
185
tbicr
{{p.User['first_name'] or 'My default string'}}
102
Torindo

docs によると、次のことができます。

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

原因Noneはブール値コンテキストでFalseにキャストします。


Update:lindesが述べたように、単純なデータ型に対してのみ機能します。

54
mitenka

他の答えに加えて、変数が次のようにNoneの場合、何か他のものを書くことができます。

{{ variable or '' }}
21
Ivan Bryzzhin

this doc に従って、この方法でこれを行うことができます。

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

「p」または「p.User」がNoneのときに例外をスローしないようにするには、次を使用できます。

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

別の解決策として(以前のいくつかのものと同様の種類):

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

最後の変数(p.User ['first_name'])の後にif definedテストがないことに注意してください。

1
Apollo

私は通常nvl関数を定義し、それをglobalsfiltersに入れます。

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
Tamas Hegedus

Ansible 2.8の時点では、次のものを使用できます。

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

https://docs.ansible.com/ansible/latest/porting_guides/porting_guide_2.8.html#jinja-undefined-values を参照してください

0
Apollo