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

Spa*_*ost 50 python jinja2

"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 '' }}

  • 今天这只给了我`TemplateAssertionError:没有名为'None'的测试 (7认同)
  • 使用`none`应该有效.参考:https://github.com/pallets/jinja/issues/520 (5认同)
  • `{{value if value!= None else''}}`可能是必要的,以避免@GeenHenk遇到的问题 (4认同)
  • 我认为`不是None`而不是`!= None`应该被使用. (4认同)
  • 截至2017年(Jinja 2.9),你只需要`{{value if value}}`.无需与None进行比较. (4认同)

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)

  • 可能是这里最优雅的解决方案.Jinja可能有这样的过滤器,可能名称比"sn"更加神秘:) (2认同)
  • 很好的答案.一个挑剔:`如果val不是None`会更具可读性. (2认同)