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中拼写错误。问题中指出,这没有帮助,因为它也会抑制数字零。有没有办法在不干扰模板的情况下进行此操作?