كيفية تجاوز طريقة zope.formlib @form.action في ore.viewlet.core.FormViewlet

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

  •  08-09-2020
  •  | 
  •  

سؤال

ملخص:

  • بلون 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.

سيكون موضع تقدير أي نصيحة.

شكرًا!

هل كانت مفيدة؟

المحلول

@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") في التسوق ، أنا لست خبيرًا وهذه التعديلات قديمة جدًا ...لقد قمت للتو بتركيتي تاركًا بمفردها الرمز المتبقي دون استخدام Super ... إذا كنت تعرف ماذا أريد أن أقصد ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top