Jinja2 шаблонная переменная, если None Object задает значение по умолчанию
Как сделать переменную в jijna2 по умолчанию "", если объект None, а не что-то вроде этого?
{% 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" не имеет атрибута "Пользователь"
Ответы
Ответ 1
Используйте встроенную функцию 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 }}
Ответ 2
{{p.User['first_name'] or 'My default string'}}
Ответ 3
Согласно документации вы можете просто сделать:
{{ p|default('', true) }}
Причина None
приводит к False
в логическом контексте.
Обновление: Как упоминалось Линде, он работает только для простых типов данных.
Ответ 4
В качестве дополнения к другим ответам можно написать что-то еще, если переменная None:
{{ variable or '' }}
Ответ 5
Следуя этот документ, вы можете сделать это следующим образом:
{{ p.User['first_name']|default('NONE') }}
Ответ 6
Чтобы избежать выброса исключения, в то время как "p" или "p.User" - None, вы можете использовать:
{{ (p and p.User and p.User['first_name']) or "default_value" }}
Ответ 7
В качестве другого решения (похоже на некоторые предыдущие):
{{ ( p is defined and p.User is defined and p.User['first_name'] ) |default("NONE", True) }}
Обратите внимание, что последняя переменная (p.User ['first_name']) не имеет тест if defined
после нее.
Ответ 8
Я обычно определяю функцию 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>
Ответ 9
Начиная с версии 2.8, вы можете просто использовать:
{{ p.User['first_name'] }}
См. Https://docs.ansible.com/ansible/latest/porting_guides/porting_guide_2.8.html#jinja-undefined-values