"None"当值为时,我如何说服Jinja2不打印None?
我在字典中有很多条目,我想在一个循环中输出所有内容,而不是针对不同的关键字有特殊情况.如果我的值为None(NoneType不是字符串),则将字符串"None"插入到模板渲染结果中.
尝试使用{{ value or '' }}效果很好地抑制它,
因为它也会替换数值零.
在将字典传递给Jinja2进行渲染之前,是否需要过滤字典?
Jor*_*ley 46
在新版本的Jinja2(2.9+)中:
{{ value if value }}
在旧版本的Jinja2中(2.9之前):
{{ value if value is not none }} 效果很好.
如果这引发了一个关于没有其他尝试使用其他的错误..
{{ value if value is not none else '' }}
Sin*_*ion 28
另一种选择是finalize在环境中使用钩子:
>>> import jinja2
>>> e = jinja2.Environment()
>>> e.from_string("{{ this }} / {{ that }}").render(this=0, that=None)
u'0 / None'
Run Code Online (Sandbox Code Playgroud)
但:
>>> 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 / '
Run Code Online (Sandbox Code Playgroud)
Bro*_*bay 18
根据Pocco邮件列表中的这篇文章:https://groups.google.com/d/msg/pocoo-libs/SQ9ubo_Kamw/TadIdab9eN8J
Armin Ronacher(Jinja2/Flask等创建者......)推荐以下"pythonic"片段:
{{ variable or 0 }} {{ variable or '' }}
这里的概念是再一次,明确优于隐含.
编辑:所选答案绝对正确.我没有真正遇到模板变量可能是字符串或数字零的情况,因此上述代码段可能有助于减少模板中的代码噪音.
Ale*_*Vhr 15
自定义过滤器可以解决问题.声明如下:
def filter_supress_none(val):
if not val is None:
return val
else:
return ''
Run Code Online (Sandbox Code Playgroud)
像这样安装:
templating_environment.filters['sn'] = filter_supress_none
Run Code Online (Sandbox Code Playgroud)
像这样使用它:
{{value|sn}}
Run Code Online (Sandbox Code Playgroud)