2010-04-22 61 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