在Jinja2中将“None”输出抑制为字符串

时间:2012-06-21 20:57:08

标签: python jinja2

当价值为"None"时,如何说服Jinja2不打印None

我在字典中有很多条目,我想在一个循环中输出所有内容,而不是针对不同的关键字有特殊情况。如果我的值为NoneNoneType而非字符串),则字符串"None"将插入到模板渲染结果中。

尝试使用它来抑制它 {{ value or '' }}效果很好,因为它也会替换数值零。

在将字典传递给Jinja2进行渲染之前,我是否需要过滤字典?

5 个答案:

答案 0 :(得分:44)

在新版本的Jinja2(2.9 +)中:

{{ value if value }}

在旧版本的Jinja2中(2.9之前):

{{ value if value is not none }}效果很好。

如果这引发了一个关于没有其他尝试使用别人的错误..

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

答案 1 :(得分:27)

另一个选择是在环境中使用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 / '

答案 2 :(得分:21)

Default filter

{{ value|default("", True) }}

答案 3 :(得分:18)

根据Pocco邮件列表中的这篇文章:https://groups.google.com/d/msg/pocoo-libs/SQ9ubo_Kamw/TadIdab9eN8J

Armin Ronacher(Jinja2 / Flask等创作者......)推荐以下“pythonic”片段:

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

这里的概念是再一次,明确优于隐含。

编辑:所选答案肯定是正确答案。我没有真正遇到模板变量可能是字符串或数字零的情况,因此上述代码段可能有助于减少模板中的代码噪音。

答案 4 :(得分:14)

自定义过滤器可以解决问题。声明如下:

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

像这样安装:

templating_environment.filters['sn'] = filter_supress_none

像这样使用:

{{value|sn}}