Подтвердить что ты не робот

Подавлять вывод "Нет" как строку в Jinja2

Как убедить Jinja2 не печатать "None", когда значение None?

У меня есть ряд записей в словаре, и я хотел бы выводить все в одном цикле вместо особых случаев для разных ключевых слов. Если у меня есть значение None (NoneType не строка), тогда строка "None" вставляется в результаты рендеринга шаблона.

Попытка подавить его, используя {{ value or '' }} работает слишком хорошо, так как он также заменит числовое значение.

Нужно ли фильтровать словарь, прежде чем передавать его в Jinja2 для рендеринга?

4b9b3361

Ответ 1

{{ value if value is not None }} отлично работает.

если это вызывает ошибку в том, что вы еще не пытаетесь использовать else.

{{ value if value is not None else '' }}

Ответ 2

Другим вариантом является использование крюка finalize в среде:

>>> import jinja2
>>> e = jinja2.Environment()
>>> e.from_string("{{ this }} / {{ that }}").render(this=0, that=None)
u'0 / None'

а

>>> def my_finalize(thing):
...     return thing if thing is not None else ''
...
>>> e = jinja2.Environment(finalize=my_finalize)
>>> e.from_string("{{ this }} / {{ that }}").render(this=0, that=None)
u'0 / '

Ответ 4

Согласно этому сообщению из списка рассылки Pocco: https://groups.google.com/d/msg/pocoo-libs/SQ9ubo_Kamw/TadIdab9eN8J

Армин Роначер (создатель Jinja2/Flask и т.д.) рекомендует следующий "pythonic" фрагмент:

{{ variable or 0 }} {{ variable or '' }}

Понятие, заключающееся в том, что снова явный предпочтительнее неявного.

Изменить: выбранный ответ определенно правильный. Я действительно не сталкивался с ситуацией, когда переменная шаблона была бы либо строкой, либо числовым нулем, поэтому приведенные выше фрагменты могут помочь уменьшить уровень шума кода в шаблоне.

Ответ 5

Пользовательский фильтр может решить проблему. Объявите это следующим образом:

def filter_supress_none(val):
    if not val is None:
        return val
    else:
        return ''

Установите его следующим образом:

templating_environment.filters['sn'] = filter_supress_none

Используйте его следующим образом:

{{value|sn}}