Ответ 1
{{ value if value is not None }}
отлично работает.
если это вызывает ошибку в том, что вы еще не пытаетесь использовать else.
{{ value if value is not None else '' }}
Как убедить Jinja2 не печатать "None"
, когда значение None
?
У меня есть ряд записей в словаре, и я хотел бы выводить все в одном цикле вместо особых случаев для разных ключевых слов. Если у меня есть значение None
(NoneType
не строка), тогда строка "None"
вставляется в результаты рендеринга шаблона.
Попытка подавить его, используя
{{ value or '' }}
работает слишком хорошо, так как он также заменит числовое значение.
Нужно ли фильтровать словарь, прежде чем передавать его в Jinja2 для рендеринга?
{{ value if value is not None }}
отлично работает.
если это вызывает ошибку в том, что вы еще не пытаетесь использовать else.
{{ value if value is not None else '' }}
Другим вариантом является использование крюка 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 / '
{{ value|default("", True) }}
Согласно этому сообщению из списка рассылки Pocco: https://groups.google.com/d/msg/pocoo-libs/SQ9ubo_Kamw/TadIdab9eN8J
Армин Роначер (создатель Jinja2/Flask и т.д.) рекомендует следующий "pythonic" фрагмент:
{{ variable or 0 }}
{{ variable or '' }}
Понятие, заключающееся в том, что снова явный предпочтительнее неявного.
Изменить: выбранный ответ определенно правильный. Я действительно не сталкивался с ситуацией, когда переменная шаблона была бы либо строкой, либо числовым нулем, поэтому приведенные выше фрагменты могут помочь уменьшить уровень шума кода в шаблоне.
Пользовательский фильтр может решить проблему. Объявите это следующим образом:
def filter_supress_none(val):
if not val is None:
return val
else:
return ''
Установите его следующим образом:
templating_environment.filters['sn'] = filter_supress_none
Используйте его следующим образом:
{{value|sn}}