オブジェクトがこのようなことをする代わりに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: 'なし'には属性 'ユーザー'がありません
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 }}
{{p.User['first_name'] or 'My default string'}}
docs によると、次のことができます。
{{ p|default('', true) }}
原因None
はブール値コンテキストでFalse
にキャストします。
Update:lindesが述べたように、単純なデータ型に対してのみ機能します。
他の答えに加えて、変数が次のようにNoneの場合、何か他のものを書くことができます。
{{ variable or '' }}
this doc に従って、この方法でこれを行うことができます。
{{ p.User['first_name']|default('NONE') }}
「p」または「p.User」がNoneのときに例外をスローしないようにするには、次を使用できます。
{{ (p and p.User and p.User['first_name']) or "default_value" }}
別の解決策として(以前のいくつかのものと同様の種類):
{{ ( p is defined and p.User is defined and p.User['first_name'] ) |default("NONE", True) }}
最後の変数(p.User ['first_name'])の後にif defined
テストがないことに注意してください。
私は通常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>
Ansible 2.8の時点では、次のものを使用できます。
{{ p.User['first_name'] }}
https://docs.ansible.com/ansible/latest/porting_guides/porting_guide_2.8.html#jinja-undefined-values を参照してください