Змінна шаблону Jinja2, якщо None Object встановила значення за замовчуванням


146

Як зробити змінну в jijna2 за замовчуванням на "", якщо об'єкт є None замість того, щоб робити щось подібне?

      {% if p %}   
        {{ p.User['first_name']}}
      {% else %}
        NONE
      {%endif %}

Отже, якщо об'єкт p - Ні, я хочу за замовчуванням значень p (ім'я та прізвище) встановити на "". В основному

nvl(p.User[first_name'], "")

Помилка отримання:

Error:  jinja2.exceptions.UndefinedError
    UndefinedError: 'None' has no attribute 'User'

1
Зробіть функцію, яка повернула значення pnever return None. Замість Noneфункції слід повернути проксі-об'єкт, який має таку саму структуру, як і реальний об'єкт, але він завантажений за замовчуванням, яке ви хочете.
Мігель

Я використовую це, і моя проблема була вирішена: {% if p! = None%} {{p.User ['first_name']}} {% endif%}
Mona Mohamadinia

Відповіді:


242

Використовуйте 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 }}

19
Зверніть увагу на малі літери noneу відповіді. Мою проблему вирішили після того, як я виправив справу "Ніхто".
harperville


70

Відповідно до документів ви можете просто зробити:

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

Причиняє Noneкасти Falseв булевому контексті.


Оновлення : Як згадувалося в ліндах, воно працює лише для простих типів даних.


5
Це працює для простої змінної, але не для цього питання, коли ви хочете схопити поле з більш складного. Я б схвалив це, оскільки це не є гарною відповіддю на первісне запитання ... і в той же час, знаючи про defaultце саме те, що мені потрібно для моєї конкретної справи, тому ... просто не голосуючи. (Редагування цієї відповіді цілком може заробити її надбавкою, за винятком того, що я думаю, що це важко застосувати defaultдо цієї ситуації)
lindes


10

Дотримуючись цього документа ви можете це зробити так:

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

8
Я не думаю, що так - фільтр шаблонів "за замовчуванням" повертає значення за замовчуванням, якщо значення не визначене / відсутнє.
кодеп

Працював для мене, коли користувався ансилом. Це зробило його більш зрозумілим: stackoverflow.com/q/28885184/1005215
Nehal J Вані

1
Якщо р визначено. Але якщо P не визначено, це не працює
відпустіть

5

Щоб уникнути викиду, якщо "p" або "p.User" є None, ви можете використовувати:

{{ (p and p.User and p.User['first_name']) or "default_value" }}

4
Це єдиний, хто працював на мене, враховуючи, що моя змінна була похована глибоко в дикті.
Craicerjack

Це допомагає очистити деякі інші з великою кількістю логіки.
орел33322

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.