3

概括:

  • 克隆 3.3.4
  • Products.PloneGetPaid 0.8.8
  • 矿石.viewlet 0.2.1

我正在尝试覆盖从 ore.viewlet.core.FormViewlet 继承的 viewlet 类。它有两种装饰方法@form.action(从 zope.formlib 导入)。我只需要覆盖其中一个。如果我也没有定义另一个,它的动作是不可用的。所以我定义了它,试图简单地传递父类的返回值。但后来我得到一个TypeError: 'Action' object is not callable.

细节:

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

class ShoppingCartActions( FormViewlet ):

我定义了从这个继承的重写类。两种装饰方法是:

@form.action(_("Continue Shopping"), name='continue-shopping')
def handle_continue_shopping( self, action, data ):

@form.action(_("Checkout"), condition="doesCartContainItems", name="Checkout")
def handle_checkout( self, action, data ):

我真的只关心覆盖第一个。我想让另一个人一个人呆着。这两个@form.action 方法在购物车管理页面的“下一步”视图中生成“继续购物”和“结帐”按钮。如果我只在我的子类中定义“继续购物”方法,“结帐”按钮就会消失。所以我尝试像这样定义 Checkout 方法:

@form.action(_("Checkout"), condition="doesCartContainItems", name="Checkout")
def handle_checkout( self, action, data ):
    return super( ShoppingCartActions, self ).handle_checkout(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.

任何提示将不胜感激。

谢谢!

4

2 回答 2

3

@form.action将该方法包装到一个form.Action实例中并将其绑定到该success_handler属性。所以你的代码应该是这样的:

@form.action(_("Checkout"), condition="doesCartContainItems", name="Checkout")
def handle_checkout( self, action, data ):
    return super(ShoppingCartActions, self).handle_checkout.success_handler(
        self, action, data)
于 2017-11-06T10:51:40.397 回答
0

也许 super 的问题比 decorate 的问题更大

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

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

  1. 人们省略了对 super(...) 的调用。如果唯一的超类是“对象”,则初始化,毕竟,对象。init什么都不做!然而,这是非常不正确的。这样做会导致其他类的init方法不被调用。
  2. 人们认为他们知道他们的方法会得到什么参数,以及应该将什么参数传递给 super。这也是不正确的。

http://fuhm.net/super-harmful/

个人而言,我没有任何问题可以覆盖,例如 ShoppingCartAddItem 中的 @form.action(_("Update"), condition="isNotEmpty") 我不是专家,这些修改已经很老了......我只是做了我的在不使用 super 的情况下单独更改剩余代码 ...如果您知道我的意思...

于 2011-05-21T10:14:43.787 回答