uliweb作者是國內python高手limodou,一直在他寫的用ulipad,感覺很不錯。
今天抽空看了一下uliweb的教程,把uliweb裡面內建的demo guestbook用svn下載下來試了一下,結果出錯了。出錯圖如下所示:
一頭霧水,秉承"知之為知之,不知google之"的優良傳統,搜一下,也沒什麼結果,可能uliweb還是比較新的東西,大家接觸並討論的比較少。看起來這次要靠自己了。仔細看了一下錯誤,是說datetime的值為None,沒有strftime屬性。有點類似C中的null 指標啦。
最後把錯誤定位在 /demos/guestbook/apps/GuestBook/models.py代碼如下
<br />from uliweb.orm import *<br />import datetime<br />class Note(Model):<br /> username = Field(str)<br /> message = Field(text)<br /> homepage = Field(str)<br /> email = Field(str)<br /> datetime = Field(datetime.datetime, auto_now_add=True)
如果猜的不錯,應該是最好一句Field傳回值為空白。
為了驗證我的猜測,只有到原始碼中需找答案了,Field 的datetime功能是由orm模組DateTimeProperty,開啟檔案/uliweb/orm/__init__.py(版本是SVN:223)
轉到第337行查看DateTimeProperty類的建構函式
def __init__(self, verbose_name=None, auto_now=False, auto_now_add=False,<br /> **kwds):<br /> super(DateTimeProperty, self).__init__(verbose_name, **kwds)<br /> self.auto_now = auto_now<br /> self.auto_now_add = auto_now_add<br /> def validate(self, value):<br /> value = super(DateTimeProperty, self).validate(value)<br /> if value and not isinstance(value, self.data_type):<br /> raise BadValueError('Property %s must be a %s' %<br /> (self.name, self.data_type.__name__))<br /> return value<br /># def default_value(self):<br /># if self.auto_now or self.auto_now_add:<br /># return self.now()<br /># return Property.default_value(self)<br />#<br /> def get_value_for_datastore(self, model_instance):<br /> if self.auto_now:<br /> return self.now()<br /> else:<br /> return super(DateTimeProperty,<br /> self).get_value_for_datastore(model_instance)
呵呵,問題應該就出在注釋掉的幾行,我查詢了一下SVN的log,應該是在220和221版本之間修改了這幾行。
有個疑問是 auto_now_add和 auto_now有什麼區別嗎?這個還沒想想通。
我們就找到瞭解決這個問題的方法了:
將 /demos/guestbook/apps/GuestBook/models.py中的最後一行的auto_now_add 修改為 auto_now即可:
#datetime = Field(datetime.datetime, auto_now_add=True)<br /> datetime = Field(datetime.datetime, auto_now=True)
總體來說,uliweb還是挺不錯的,比django還容易上手,繼續學習……