Переменная шаблона Jinja2, если None Object устанавливает значение по умолчанию

151

Как сделать переменную в jijna2 по умолчанию равной "", если объект None вместо того, чтобы делать что-то вроде этого?

      {% 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'
mcd
источник
1
Сделайте так, чтобы функция, возвращающая значение, pникогда не возвращалась None. Вместо этого Noneфункция должна возвращать прокси-объект, который имеет ту же структуру, что и реальный объект, но загружается с нужными вам значениями по умолчанию.
Мигель
Я использую это, и моя проблема была решена: {% if p! = None%} {{p.User ['first_name']}} {% endif%}
Мона Мохамадиния

Ответы:

257

Используйте 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 }}
tbicr
источник
22
Обратите внимание на строчные буквы noneв ответе. Моя проблема была решена после того, как я исправил случай None.
harperville
Очень здорово, спасибо! :)
madaimartin
131
{{p.User['first_name'] or 'My default string'}}
Ториндо
источник
74

Согласно документам вы можете просто сделать:

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

Причина Noneпреобразуется Falseв логический контекст.


Обновление : как упоминалось Линдес, он работает только для простых типов данных.

митенка
источник
6
Это работает для простой переменной, но не для этого вопроса, когда вы хотите выделить поле из более сложного. Я бы проголосовал против этого, так как это не лучший ответ на исходный вопрос ... и в то же время, знание об этом default- это именно то, что мне нужно для моего конкретного случая, так что ... просто не голосовать. (Редактирование этого ответа вполне может принести ему одобрение, за исключением того, что я думаю, что это, вероятно, трудно применить defaultк этой ситуации)
lindes
37

В дополнение к другим ответам можно написать что-то еще, если переменная None, например:

{{ variable or '' }}
Иван Брызжин
источник
3
Меня поражает такая простота! Python x or yесть if x is false, then y, else x. См .: 5.2. Логические операции - и, или, не
kenjiuno
12

Следуя этому документу, вы можете сделать это следующим образом:

{{ p.User['first_name']|default('NONE') }}
pawel7318
источник
8
Я так не думаю - фильтр шаблона "по умолчанию" возвращает значение по умолчанию, если значение не определено / отсутствует.
codeape
Работал у меня при использовании ансибла. Это сделало его более ясным: stackoverflow.com/q/28885184/1005215
Nehal J Wani
1
Если p определено. Но если P не определен, это не сработает
dalore
6

Чтобы избежать генерации исключения, когда «p» или «p.User» имеет значение None, вы можете использовать:

{{ (p and p.User and p.User['first_name']) or "default_value" }}
Sub
источник
4
Это единственное, что сработало для меня, учитывая, что моя переменная была похоронена глубоко в dict.
Craicerjack
Это помогает очистить некоторые другие с помощью большой логики.
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функцию и помещаю ее в 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>
Тамас Хегедус
источник