Jinja2为Google App Engine模型返回"None"字符串

2 投票
3 回答
3292 浏览
提问于 2025-04-15 21:55

Google App Engine 模型,像这样:

from google.appengine.ext.db import Model

class M(Model):
    name = db.StringProperty()

然后在一个叫做 Jinja2 的模板中,这个模板是从 Django 的视图中调用的,并且传入了一个 M 的实例,命名为 m

The name of this M is {{ m.name }}.

m 被初始化时,如果没有设置 name,那么会打印出以下内容:

这个 M 的名字是 None。

理想的输出(也是使用 Django 模板时的输出)应该是:

这个 M 的名字是 。

你知道为什么会这样吗?还有怎样才能得到理想的输出呢?

3 个回答

1

如果他不想让空字符串作为默认值怎么办?

我自己也遇到过这个问题。我不想要空字符串。我想要的是 null/None/NoneType。这和空字符串是两回事。

所以我再次问大家——Jinja 为什么一定要把 "None" 转换成别的东西呢?这是什么情况?

1

我觉得你自己已经找到了答案。如果你没有给那个属性指定一个名字,App Engine 似乎会把它存储为 None,而不是空字符串 "",所以当它被打印出来时,就会显示为 "None"。如果你把默认值设为 "",那么你的问题就解决了,就像你说的那样。

14

你可能还想考虑使用Jinja2的“或”操作...

The name of this M is {{ m.name or ''}}.

如果 bool(m.name) == False,那么会显示 这个 M 的名字是 .


如果 m.name == False,并且你想把它显示为字符串“False”,你可以使用Jinja2的“默认”过滤器:

The name of this M is {{ m.name|default('') }}

如果 m.name is None,那么会显示 这个 M 的名字是 .

如果 m.name == False,那么会显示 这个 M 的名字是 False.


如果你想使用默认过滤器,并且希望任何被评估为 False 的值都显示为你定义的默认值,可以添加一个额外的参数:

The name of this M is {{ m.name|default('', true) }}

这应该和 {{ m.name or '' }} 有完全相同的效果。


你可以在 Jinja2的内置过滤器参考 找到所有这些信息。

撰写回答