Python 压制;无”;在Jinja2中作为字符串输出
当值为Python 压制;无”;在Jinja2中作为字符串输出,python,jinja2,Python,Jinja2,当值为None时,如何说服Jinja2不打印“None” 我在一个字典中有很多条目,我希望在一个循环中输出所有内容,而不是为不同的关键字设置特殊的情况。如果我的值为None(NoneType不是字符串),则字符串“None”将插入到模板呈现结果中 试图使用 {{value或''}}工作得太好了,因为它也将替换数值零 在将字典传递给Jinja2进行渲染之前,是否需要对其进行过滤?在新版本的Jinja2(2.9+)中: {{value if value}} 在旧版本的Jinja2(2.9之前)中:
None
时,如何说服Jinja2不打印“None”
我在一个字典中有很多条目,我希望在一个循环中输出所有内容,而不是为不同的关键字设置特殊的情况。如果我的值为None
(NoneType
不是字符串),则字符串“None”
将插入到模板呈现结果中
试图使用
{{value或''}}
工作得太好了,因为它也将替换数值零
在将字典传递给Jinja2进行渲染之前,是否需要对其进行过滤?在新版本的Jinja2(2.9+)中:
{{value if value}}
在旧版本的Jinja2(2.9之前)中:
{{value if value not none}}
非常有效
如果这导致没有else的错误,请尝试使用else
{{如果值不是其他值,则为值}
:
另一个选项是在环境上使用
finalize
钩子:
>>> import jinja2
>>> e = jinja2.Environment()
>>> e.from_string("{{ this }} / {{ that }}").render(this=0, that=None)
u'0 / None'
但是:
自定义筛选器可以解决此问题。声明如下:
def filter_suppress_none(val):
if not val is None:
return val
else:
return ''
templating_environment.filters['sn'] = filter_suppress_none
{{value|sn}}
按如下方式安装:
def filter_suppress_none(val):
if not val is None:
return val
else:
return ''
templating_environment.filters['sn'] = filter_suppress_none
{{value|sn}}
像这样使用它:
def filter_suppress_none(val):
if not val is None:
return val
else:
return ''
templating_environment.filters['sn'] = filter_suppress_none
{{value|sn}}
根据Pocco邮件列表中的这篇文章: Armin Ronacher(Jinja2/Flask等的创建者)推荐以下“pythonic”片段:
{{variable或0}}
{{{variable或''}}}
这里的概念再次表明,显式比隐式更可取
编辑:选择的答案肯定是正确的。我还没有遇到模板变量是字符串或数字零的情况,因此上面的代码片段可能有助于减少模板中的代码噪音 这与OP的主要解决方案有相同的问题。。。我认为这将作为{{value | default(“,True)}}工作,如果没有True,这根本不起作用。如果为True,它将替换None和数字零。。所以这不好。你是对的,它只在变量没有定义时才起作用,而不是给它赋值。但是为None情况编写一个过滤器是值得的,因为它比选择的答案更详细。我最喜欢这个解决方案。我遇到了一个错误:
undeinderror:inline if表达式计算为false,并且没有定义else部分。
{{value if value!=None else'}
可能是避免问题的必要条件@geenhank hadI认为不是无的
而不是!=应该使用None
。今天这只给了我TemplateAssertionError:从2017年(Jinja 2.9)起,没有名为“None”的测试,您只需要{{value if value}}
。无需与无进行比较。可能是这里最优雅的解决方案。Jinja可以有一个这样的过滤器,也许它的名字比“sn”更隐晦:很好的答案。有一点挑剔:如果val不是None
会更可读。我也喜欢这个答案,但有一点小小的修正:“suppress”在函数def中拼写错误。问题中指出,这没有帮助,因为它也会抑制数字零。有没有办法在不干扰模板的情况下进行此操作?