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>