如何重写z3c.form按钮操作处理程序?

2024-04-28 10:54:44 发布

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

默认的Dexterity add表单注册save按钮和处理程序,因此:

@button.buttonAndHandler(_('Save'), name='save')
def handleAdd(self, action):
    data, errors = self.extractData()
    if errors:
        self.status = self.formErrorsMessage
        return
    obj = self.createAndAdd(data)
    if obj is not None:
        # mark only as finished if we get the new object
        self._finishedAdd = True
        IStatusMessage(self.request).addStatusMessage(
            self.success_message, "info"
        )

如何用我自己的处理程序重写(仅)处理程序?我希望只注册一些适配器,但是如果注册子类自定义表单是唯一的选择,那么这也是可以接受的。在


Tags: nameselfaddobj处理程序表单dataif
2条回答

处理程序没有全局注册(并且窗体本地注册仅针对按钮),因此不能仅重写处理程序。从技术上讲,您可以(至少对于edit form)重写默认的按钮操作处理程序,该处理程序将查找所有处理程序,但最干净的解决方案只是将窗体子类化并重写。在

根据您的需要,只需覆盖createAndAdd就足够了,但一般来说,您可以执行类似的操作:

特别是,您可以使用原始类的处理程序执行类似的操作(第50行):

@button.buttonAndHandler(_(u'I am sure, delete now'), name='Delete')
def handle_delete(self, action):
    base_handler = super(PIDeleteConfirmationForm, self).handle_delete
    return base_handler(self, action)

当然,您可以在调用base_处理程序之前和之后添加自定义代码。在

此外,您还可以使用updateActions方法(参见第28行)。在

记住,当你想要覆盖按钮时,你必须覆盖所有按钮。在

另一个技巧是,为了定制你的++你的.portal.typetraverser您必须注册同名的适配器:

^{pr2}$

http://docs.plone.org/develop/plone/content/dexterity.html#custom-add-form-view

相关问题 更多 >