Jinja2为Google App Engine模型返回"None"字符串
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 个回答
如果他不想让空字符串作为默认值怎么办?
我自己也遇到过这个问题。我不想要空字符串。我想要的是 null/None/NoneType。这和空字符串是两回事。
所以我再次问大家——Jinja 为什么一定要把 "None" 转换成别的东西呢?这是什么情况?
我觉得你自己已经找到了答案。如果你没有给那个属性指定一个名字,App Engine 似乎会把它存储为 None,而不是空字符串 "",所以当它被打印出来时,就会显示为 "None"。如果你把默认值设为 "",那么你的问题就解决了,就像你说的那样。
你可能还想考虑使用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的内置过滤器参考 找到所有这些信息。