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

StackOverflow https://stackoverflow.com/questions/6078913

  •  08-09-2020
  •  | 
  •  

Вопрос

Краткое содержание:

  • Плон 3.3.4
  • Продукты.PloneGetPaid 0.8.8
  • ore.viewlet 0.2.1

Я пытаюсь переопределить класс представления, который наследуется от 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.

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

Спасибо!

Это было полезно?

Решение

@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. Люди пропускают вызовы super(...).в этом если единственным суперклассом является «объект», как, в конце концов, и объект.в этом ничего не делает!Однако это очень неправильно.Это приведет к тому, что другие классы в этом методы, которые нельзя вызывать.
  2. Люди думают, что знают, какие аргументы получит их метод и какие аргументы им следует передать в super.Это также неверно.

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

Personnaly у меня не было никакой проблемы с переопределением, например, @form.action (_ («Обновление»), условие = "isnotempty") в ShoppingCartAdditem Я не эксперт, и эти модификации довольно старые ...Я только что оставил свои изменения оставшимся оставшимся кодом без использования супер ... если вы знаете, что я хочу иметь в виду ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top