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

问题描述 投票:0回答:6

当值为

"None"
时,如何说服 Jinja2 不打印
None

我的字典中有许多条目,我想在一个循环中输出所有内容,而不是针对不同的关键字有特殊情况。如果我的值为

None
NoneType
不是字符串),则字符串
"None"
会插入到模板渲染结果中。

尝试使用抑制它

{{ value or '' }}
效果很好,因为它也可以替换数值零。

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

python jinja2
6个回答
77
投票

在 Jinja2 新版本(2.9+)中:

{{ value if value }}

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

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

如果这引发了关于没有 else 的错误,请尝试使用 else ..

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


36
投票

另一种选择是在环境中使用

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 / '

29
投票

默认过滤器

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

23
投票

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

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

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

这里的概念是,显式优于隐式。

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


23
投票

自定义过滤器可以解决这个问题。像这样声明:

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

像这样安装:

templating_environment.filters['sn'] = filter_suppress_none

像这样使用它:

{{value|sn}}

0
投票

如果您使用烧瓶:

app.jinja_env.finalize = lambda x: x if x is not None else ''
© www.soinside.com 2019 - 2024. All rights reserved.