[英]Zope.Schema/Plone - How can I set the value of a Datetime field in an updateWidget function?
在我正在工作的plone站點上,我有一個表單,該表單用於編輯映射到后端數據庫中的表的存儲對象的記錄。 在接口類中,字段之一是schema.Datetime字段。
class ICalibration(Interface):
"""Interface class for calibration records
"""
...
Last_Calibration = schema.Datetime(title=u"Last Calibration"
description=u"date of last calibration",
)
...
在我的updateWidgets函數的編輯表單中,我嘗試設置窗口小部件的值,
class EditCalibration(form.Form):
grok.name('edit-calibration')
grok.require('zope2.View')
grok.context(ISiteRoot)
def updateWidgets(self):
super(EditCalibration, self).updateWidgets()
id = self.request.get('id',None)
if id:
currentCal = session.query(Calibration).filter(Calibration.Calibration_ID == id).one()
...
self.widgets["Last_Calibration"].value = currentCal.Last_Calibration
...
但是我得到這個錯誤:
“ TypeError:'datetime.datetime'對象沒有屬性' getitem '。
我確實嘗試了一些有趣的事情。 我打印了cal.Last_Calibration的值並將其顯示為添加記錄時輸入的日期。
我嘗試打印cal.Last_Calibration是的對象類型,它是python的日期時間(與我相信的zope相反)。 我嘗試將字段設置為等於今天的日期:datetime.today(),並得到了相同的錯誤。 只是為了踢球,我還嘗試將currentCal.Last_Calibration轉換為字符串並將其傳遞到字段中,盡管這只是在字段中放入了隨機數。
為了記錄,我將python的日期時間導入為:
from datetime import datetime
另外,添加記錄/校准也可以,因此與我正在使用的數據庫或sqlalchemy模式無關。
如果可能,在updateWidgets函數中設置架構字段值的適當方法是什么?
我應該使用其他小部件嗎? 如果是這樣,我真正需要的只是日期。 add / update函數將使用一個datetime對象,因此無論我相信哪種類型,我都可以從數據中創建一個datetime對象。
在z3c.form框架中,發生以下步驟來獲取小部件值:
您的問題是您試圖將窗口小部件的值設置為日期時間,而不是將窗口小部件期望的日期時間序列化。
我會通過重寫getContent而不是updateWidgets來做您要做的事情:
from five import grok
from plone.directives import form
class EditCalibration(form.SchemaForm):
grok.name('edit-calibration')
grok.require('zope2.View')
grok.context(ISiteRoot)
schema = ICalibration
def getContent(self):
id = self.request.get('id', None)
if id:
return session.query(Calibration).filter(Calibration.Calibration_ID == id).one()
您還需要聲明您的Calibration類實現ICalibration接口,以便z3c.form識別它可以獲取Last_Calibration作為Calibration實例的屬性。 看起來應該像這樣:
from zope.interface import implementer
@implementer(ICalibration)
class Calibration(Base):
etc...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.