Как переопределить метод zope.formlib @form.action в ore.viewlet.core.FormViewlet

Резюме:

  • Plone 3.3.4
  • Products.PloneGetPaid 0.8.8
  • ore.viewlet 0.2.1

Я пытаюсь переопределить класс Viewlet, который наследуется от ore.viewlet.core.FormViewlet. У этого есть два метода, украшенных @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,

Любой совет будет оценен.

Спасибо!

2 ответа

Решение

@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)

Может быть, это больше проблема с супер, чем с украшением

Одна большая проблема с 'super' заключается в том, что, похоже, он вызовет копию метода суперкласса. Это просто не тот случай, он вызывает следующий метод в MRO.

Это неправильное представление заставляет людей совершать две распространенные ошибки.

  1. Люди опускают звонки на супер (...).init, если единственным суперклассом является 'object', как, в конце концов, object.init ничего не делает! Однако это очень неправильно. Это приведет к тому, что методы init других классов не будут вызываться.
  2. Люди думают, что знают, какие аргументы получит их метод, и какие аргументы они должны передать супер. Это тоже неверно.

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

Персонально У меня не было никаких проблем переопределить, например, @form.action(_("Update"), condition="isNotEmpty") в ShoppingCartAddItem Я не эксперт, и эти модификации довольно старые... Я только что сделал свой изменения, оставив в покое оставшийся код без использования super... если вы знаете, что я хочу иметь в виду...

Другие вопросы по тегам