2010-04-22 69 views
2

谷歌应用程序引擎的模型,likeso“无”字符串:Jinja2的返回谷歌应用程序引擎车型

from google.appengine.ext.db import Model 

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

然后从Django视图调用一个在M传递进来m实例Jinja2的模板:

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

m时而不name设定初始化,以下是印刷:

这个M的名字是None。

优选的和预期的输出(和使用Django模板时的输出)将是/是:

此M的名称是。

您是否知道为什么会发生这种情况,以及如何获得预期输出的首选&?

+0

这是值得注意的是,设置默认值,鼻翼。 'name = db.StringProperty(default =“”)'解决了这个问题。问题似乎是'm.name'是NoneType,除非有一个默认值。 – 2010-04-23 00:53:52

+0

你的类应该继承'db.Model',如下所示:'class M(db.Model):' - 是否会改变任何东西? – 2010-04-23 01:48:30

+0

@Jason Hall - 感谢您的接触。不幸的是,这并没有解决这个问题。 – 2010-04-23 02:50:23

回答

14

您可能还需要考虑使用的Jinja2的“或” ......

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

如果bool(m.name) == False,这将显示The name of this M is .


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

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

如果m.name is None,这将显示The name of this M is .

如果m.name == False,这将显示The name of this M is False.


如果你想使用默认过滤器,仍然有什么评价,以显示为您定义的默认值false,添加extra参数:

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

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


你可以找到所有这些信息对Jinja2's Builtin Filters reference

+0

优秀的建议;谢谢,Jgeewax。 – 2010-12-13 17:31:53

1

我想你自己碰到了答案。如果您没有为该属性指定名称,则App Engine似乎将其存储为None,而不是“”,因此打印时会将其打印为“None”。指定默认为“”,你的问题就会消失,就像你说的那样。

+0

值得注意的是,你可以通过修改class jinja2.Undefined来解决这个问题。 – 2010-04-24 13:25:13

1

如果他不想将空字符串作为默认值会怎么样?

我自己也有这个问题。我不想在那里出现空串。我想要null/None/NoneType。这与空字符串不一样。

所以我再次向大家提问 - 金佳坚持翻译“无”。是什么赋予了?

+0

我想你可以通过重载'jinja2.Undefined' 并将'undefined'参数传递给'jinja2.Environment'来解决这个问题。 – 2010-11-15 15:49:47

+0

尝试使用金嘉过滤器“默认” – uralbash 2012-02-08 07:13:56