【问题标题】:Suppress "None" output as string in Jinja2在 Jinja2 中将“None”输出抑制为字符串
【发布时间】:2012-06-24 04:29:25
【问题描述】:

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

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

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

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

【问题讨论】:

  • 有什么办法可以做到不干扰模板吗?

标签: python jinja2


【解决方案1】:

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

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

这样安装:

templating_environment.filters['sn'] = filter_suppress_none

像这样使用它:

{{value|sn}}

【讨论】:

  • 可能是这里最优雅的解决方案。 Jinja 可以有一个像这样的过滤器,名字可能比“sn”更隐秘:)
  • 很好的答案。一个挑剔:if val is not None 会更具可读性。
  • 也喜欢这个答案,但稍作更正:'suppress' 在函数 def 中拼写错误。
【解决方案2】:

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

{{ value if value }}

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

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

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

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

【讨论】:

  • 我收到了一个错误:UndefinedError: the inline if-expression evaluated to false and no else section was defined.
  • {{ value if value != None else '' }} 可能是避免@GeenHenk 遇到的问题所必需的
  • 我认为应该使用is not None 而不是!= None
  • 今天这只是给我TemplateAssertionError: no test named 'None'
  • 截至 2017 年(Jinja 2.9),您只需要 {{ value if value }}。无需与无比较。
【解决方案3】:

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

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

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

这里的概念再次强调,显式优于隐式。

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

【讨论】:

  • 问题中指出这无济于事,因为它还会抑制数字零
【解决方案4】:

Default filter:

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

【讨论】:

  • 这与 OP 的主要解决方案有同样的问题......我认为这将作为 {{ value|default("", True ) }}
  • 没有 True,这根本行不通。使用 True,它会替换 None 和数字零 .. 所以不好。
  • 您是对的,它仅在未定义变量而不是为其分配 None 时才有效。但是为 None 情况编写一个过滤器是值得的,因为它比选择的答案更简洁。
  • 我最喜欢这个解决方案。
【解决方案5】:

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

【讨论】:

  • 我认为这是最聪明的方法。但是,当我使用 FastAPI 的 jinja2 尝试此方法时,模板中的 url_for() 停止工作。供您参考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 2015-04-26
相关资源
最近更新 更多