如何在ore.viewlet.core.FormViewlet中重写zope.formlib@form.action方法 总结: Plone 3.3.4 Products.PloneGetPaid 0.8.8 ore.viewlet 0.2.1

如何在ore.viewlet.core.FormViewlet中重写zope.formlib@form.action方法 总结: Plone 3.3.4 Products.PloneGetPaid 0.8.8 ore.viewlet 0.2.1,plone,plone-3.x,Plone,Plone 3.x,我正在尝试重写从ore.viewlet.core.FormViewlet继承的viewlet类。它有两个用@form.action(从zope.formlib导入)修饰的方法。我只需要覆盖其中一个。如果我不定义另一个,它的操作将不可用。所以我定义了它,试图简单地传递父类的返回值。但是我得到了一个类型错误:“Action”对象是不可调用的 细节: 具体来说,我正在覆盖Products.PloneGetPaid.browser.cart.ShoppingCartActions,其定义如下: clas

我正在尝试重写从ore.viewlet.core.FormViewlet继承的viewlet类。它有两个用
@form.action
(从zope.formlib导入)修饰的方法。我只需要覆盖其中一个。如果我不定义另一个,它的操作将不可用。所以我定义了它,试图简单地传递父类的返回值。但是我得到了一个
类型错误:“Action”对象是不可调用的

细节: 具体来说,我正在覆盖Products.PloneGetPaid.browser.cart.ShoppingCartActions,其定义如下:

class ShoppingCartActions(FormViewlet):
我定义了要从中继承的重写类。这两种装饰方法是:

@form.action(uquo(“继续购物”),name='Continue-Shopping')
def处理继续购物(自我、动作、数据):

@form.action(u(“Checkout”),condition=“doesCartContainItems”,name=“Checkout”)
def句柄_签出(自身、操作、数据):
我真的只在乎超越第一条。我想让另一个单独呆着。这两个@form.action方法在购物车管理页面的“下一步”viewlet中生成“继续购物”和“结帐”按钮。如果我只在我的子类中定义“继续购物”方法,“结帐”按钮就会消失。因此,我尝试如下定义签出方法:

@form.action(u(“Checkout”),condition=“doesCartContainItems”,name=“Checkout”)
def句柄_签出(自身、操作、数据):
返回超级(ShoppingCartActions,self)。处理签出(action,data)
但是我得到了这个错误:

2011-05-20 17:01:40 ERROR Zope.SiteErrorLog http://localhost:8080/obrien/@@getpaid-cartTraceback (innermost last):
  Module ZPublisher.Publish, line 119, in publish
  Module ZPublisher.mapply, line 88, in mapply
  Module ZPublisher.Publish, line 42, in call_object
  Module Products.PloneGetPaid.browser.cart, line 46, in __call__
  Module zope.viewlet.manager, line 104, in update
  Module ore.viewlet.core, line 15, in update
  Module Products.PloneGetPaid._patch, line 44, in update
  Module zope.formlib.form, line 750, in update
  Module zope.formlib.form, line 594, in success
  Module plonetheme.obrienskin.browser.cart, line 23, in handle_checkout
TypeError: 'Action' object is not callable
这让我觉得重写和继承用
@form.action
修饰的方法肯定有一些技巧

任何小费都将不胜感激


谢谢

也许super的问题比装饰的问题更大

“super”的一个大问题是,它听起来好像会导致调用超类的方法副本。事实并非如此,它会导致调用MRO中的下一个方法

这种误解导致人们犯两个常见错误

  • 人们忽略了对super(…)的调用。init如果唯一的超类是'object',毕竟是object。init什么都不做!然而,这是非常不正确的。这样做将导致不调用其他类的init方法
  • 人们认为他们知道他们的方法将得到什么参数,以及应该传递给super的参数。这也是不正确的

    例如,我没有任何问题需要重写 @ShoppingCartAddItem中的form.action(u(“更新”),condition=“isNotEmpty”) 我不是专家,这些修改都很老了。。。 我只是做了一些修改,没有使用super,只保留了剩下的代码
    …如果您知道我的意思…

    @form.action
    将该方法包装到
    form.action
    实例中,并将其绑定到
    success\u handler
    属性。因此,您的代码应该如下所示:

    @form.action(u(“Checkout”),condition=“doesCartContainItems”,name=“Checkout”)
    def句柄_签出(自身、操作、数据):
    return super(ShoppingCartActions,self)。handle\u checkout.success\u handler(
    自我、行动、数据)
    
    哇,我完全忘了这个问题!关于这件事我不太记得了,但你的回答听起来不错。