Переменная шаблона 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'

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 }}

22
Обратите внимание на строчные буквы noneв ответе. Моя проблема была решена после того, как я исправил случай None.
harperville

Очень здорово, спасибо! :)
madaimartin


74

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

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

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


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


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


12

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

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

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" }}

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>

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.