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


146

このようなことをする代わりに、オブジェクトが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
pnever の値を返した関数を作成しますNoneNone関数の代わりに、実際のオブジェクトと同じ構造を持つプロキシオブジェクトを返す必要がありますが、必要なデフォルト値がロードされます。
ミゲル

私はこれを使用し、私の問題は解決しました:{%if p!= None%} {{p.User ['first_name']}} {%endif%}
Mona Mohamadinia

回答:


242

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のケースを修正した後、私の問題は解決しました。
harperville 2016年


70

ドキュメントによると、あなたはただ行うことができます:

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

原因NoneにキャストFalse真偽値。


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


5
これは単純な変数では機能しますが、より複雑なフィールドからフィールドを取得しようとしているこの質問では機能しません。元の質問への良い答えではないので、私はこれに反対票を投じますが、それと同時に、default私が特定の場合に正確に何を必要としているかを知ることは、単に投票しないだけです。(この回答を編集すると、defaultこの状況に適用するのが難しいと思うことを除いて、
賛成票を得る

31

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

{{ variable or '' }}

3
このシンプルさに驚いています!Python x or yif x is false, then y, else xです。5.2を
kenjiuno 2017年

10

このドキュメントに従うと、次のようになります。

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

8
私はそうは思いません-値が未定義/欠落している場合、「デフォルト」のテンプレートフィルターはデフォルト値を返します。
codeape、2014年

ansibleを使用するときに私のために働いた。これは、それがより明確になる:stackoverflow.com/q/28885184/1005215
Nehal Jワニ

1
pが定義されている場合。しかし、Pが定義されていない場合は機能しません
ダロア

5

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

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

4
私の変数が辞書に深く埋め込まれていたので、これは私のために働いた唯一のものです。
Craicerjack 2017

これは、多くのロジックで他の一部をクリーンアップするのに役立ちます。
eagle33322

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関数を定義し、それをglobalsandに入れ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>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.