繁体   English   中英

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

[英]Suppress "None" output as string in Jinja2

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

我在字典中有许多条目,我想在一个循环中输出所有内容,而不是为不同的关键字设置特殊情况。 如果我的值为NoneNoneType不是字符串),则字符串"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 '' }}

这里的概念再次表明,显式优于隐式。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM