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

2024-05-14 19:10:56 发布

您现在位置:Python中文网/ 问答频道 /正文

在我工作的plone站点上,我有一个表单,用于编辑映射到后端数据库中表的对象的记录。在接口类中,其中一个字段是架构.日期时间字段。在

class ICalibration(Interface):
"""Interface class for calibration records
"""
...
    Last_Calibration = schema.Datetime(title=u"Last Calibration"
                                       description=u"date of last calibration",


                                      )
...

在我的updateWidgets函数中,在编辑表单中,我尝试设置小部件的值

^{pr2}$

但我得到一个错误:

“类型错误:'日期时间。日期时间“object没有属性'getitem”。在

我确实尝试了一些有趣的东西。 我打印了校准上一次校准它是我添加唱片时输入的日期。
我试着打印校准上一次校准是的,这是python的datetime(与zope的日期时间相反,我相信?)。 我尝试将字段设置为今天的日期:日期时间。今天()得到了同样的错误。 只是为了好玩,我也试着转换当前校准最后一次校准传递给一个字符串并将其传递到字段中,尽管这只是将随机数放入字段中。在

作为记录,我将python的datetime导入为:

from datetime import datetime

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

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

我应该使用不同的小工具吗?如果是这样的话,我只需要填写日期。add/update函数将接受一个datetime对象,因此我可以从数据创建一个datetime对象,而不管我相信的类型是什么。在


Tags: 对象函数数据库编辑表单datetime错误记录
1条回答
网友
1楼 · 发布于 2024-05-14 19:10:56

在z3c.form框架中,以下步骤正好可以获得小部件值:

  1. 如果请求已经有一个值(来自以前提交的表单),则使用它。在
  2. 如果form.ignoreContext==False(默认值),它调用表单.getContent()获取表单正在编辑的“内容对象”(默认为窗体上下文). 在
  3. 如果内容对象提供字段来自的架构接口,则“字段值”将作为对象的属性获取。(如果它不提供模式接口,z3c.form将查找对象到模式接口的适配器,并获取适配器上的属性。如果内容对象是dict,则字段值将作为dict的一个项而不是使用属性查找来获取。)
  4. 基于字段类型和小部件类型的“转换器”用于将字段值转换为小部件值。区别在于字段值是实际存储的值,而小部件值是该值的字符串序列化。在

您的问题是您试图将小部件值设置为datetime,而不是小部件所期望的datetime的序列化。在

我将通过重写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识别它可以获得最后一次校准作为校准实例的属性。应该是这样的:

^{pr2}$

相关问题 更多 >

    热门问题