说服Jinja2在值None
时不要打印"None"
?
我在字典中有许多条目,我想在单个循环中输出所有内容,而不是为不同的关键字设置特殊情况。 如果我的值为 None
(NoneType
而不是字符串),则字符串"None"
将插入到模板渲染结果中。
尝试使用 {{ value or '' }}
工作得太好了,因为它也会替换数值零。
在将字典传递给 Jinja2 进行渲染之前,我是否需要过滤字典?
在新版本的 Jinja2 (2.9+) 中:
{{ value if value }}
在旧版本的 Jinja2(2.9 之前)中:
{{ value if value is not none }}
效果很好。
如果这引发了关于没有 else 的错误,请尝试使用 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) }}
自定义过滤器可以解决这个问题。像这样声明它:
def filter_suppress_none(val):
if not val is None:
return val
else:
return ''
像这样安装它:
templating_environment.filters['sn'] = filter_suppress_none
像这样使用它:
{{value|sn}}
根据Pocco邮件列表中的这篇文章: https://groups.google.com/d/msg/pocoo-libs/SQ9ubo_Kamw/TadIdab9eN8J
Armin Ronacher(Jinja2/Flask等的创建者)推荐以下"pythonic"片段:
{{ variable or 0 }}
{{ variable or '' }}
这里的概念是,再次,显式比隐式更可取。
编辑:所选答案绝对是正确的。我还没有真正遇到过模板变量是字符串或数字零的情况,因此上述代码片段可能有助于减少模板中的代码噪音。