gpt4 book ai didi

python - Zope.Schema/Plone - 如何在 updateWidget 函数中设置 Datetime 字段的值?

转载 作者:太空宇宙 更新时间:2023-11-04 01:12:25 25 4
gpt4 key购买 nike

在我正在使用的一个 Plone 站点上,我有一个表单用于编辑存储映射到后端数据库中的表的对象的记录。在接口(interface)类中,其中一个字段是 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
...

但是我得到这个错误:

“类型错误:‘datetime.datetime’对象没有属性‘getitem’。

我确实尝试了一些有趣的事情。我打印了 cal.Last_Calibration 的值,它是我添加记录时输入的日期。
我尝试打印 cal.Last_Calibration 的对象类型,它是 python 的日期时间(我相信与 zope 的相反?)。我尝试将字段设置为今天的日期:datetime.today() 并得到相同的错误。只是为了好玩,我还尝试将 currentCal.Last_Calibration 转换为字符串并将其传递到字段中,尽管这只是将随机数放入字段中。

作为记录,我将 python 的日期时间导入为:

from datetime import datetime

此外,添加记录/校准工作正常,所以这不是数据库或我正在使用的 sqlalchemy 模式的问题。

如果可能,在 updateWidgets 函数中设置架构字段值的合适方法是什么?

我应该使用不同的小部件吗?如果是这样,我真正需要的只是日期。添加/更新函数将采用日期时间对象,因此我可以根据数据创建日期时间对象,而不管我认为是什么类型。

最佳答案

在 z3c.form 框架中,获取小部件值的步骤如下:

  1. 如果请求已经有一个值(来自以前的表单提交),则使用它。
  2. 如果 form.ignoreContext == False(默认值),它会调用 form.getContent() 以获取表单正在编辑的“内容对象”(默认为 form.context)。
  3. 如果内容对象提供字段来自的架构接口(interface),“字段值”将作为对象的属性获取。 (如果它不提供模式接口(interface),z3c.form 寻找对象到模式接口(interface)的适配器,并获取适配器上的属性。如果内容对象是字典,则字段值将作为项目获取字典而不是使用属性查找。)
  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 接口(interface),以便 z3c.form 认识到它可以获得 Last_Calibration 作为 Calibration 实例的一个属性。这应该看起来像这样:

from zope.interface import implementer

@implementer(ICalibration)
class Calibration(Base):
etc...

关于python - Zope.Schema/Plone - 如何在 updateWidget 函数中设置 Datetime 字段的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26921612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com