簡體   English   中英

Zope.Schema / Plone-如何在updateWidget函數中設置Datetime字段的值?

[英]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框架中,發生以下步驟來獲取小部件值:

  1. 如果請求已經具有值(來自先前的表單提交),則使用該值。
  2. 如果form.ignoreContext == False(默認值),它將調用form.getContent()以獲取表單正在編輯的“內容對象”(默認為form.context)。
  3. 如果內容對象提供字段來自的架構接口,則將“字段值”作為對象的屬性來獲取。 (如果z3c.form不提供架構接口,則在架構接口中查找對象的適配器,並在適配器上獲取屬性。如果內容對象是dict,則將字段值作為項獲取而不是使用屬性查找。)
  4. 基於字段類型和窗口小部件類型的“轉換器”用於將字段值轉換為窗口小部件值。 區別在於字段值是實際存儲的值,而小部件值是該值的字符串序列化。

您的問題是您試圖將窗口小部件的值設置為日期時間,而不是將窗口小部件期望的日期時間序列化。

我會通過重寫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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM