2016-03-10 5 views
0

Я новичок в python и django, пожалуйста, кто-нибудь может объяснить мне наследование mechanizm в классах на основе django/python? Пример здесь:Django FormView наследование

class FormViewA(FormView): 
    form_class = MyFormClass 
    template_name = 'mytemplate.html' 

    def get_success_url(self): 
     return reverse('my_url') 
    def form_valid(self, form): 
     form.save() 
     print "in FormViewA" 
     return super(FormViewA, self).form_valid(form) 


class FormViewB(FormViewA): 
    def form_valid(self, form): 
     form.save() 
     print "in FormViewB" 
     return super(FormViewB, self).form_valid(form) 

Если я использую FormViewB создать форму в своих шаблонах код из form_valid из FormViewA по-прежнему работать, и я вижу этот вывод:

in FormViewB 
in FormViewA 

Объясните мне, пожалуйста, что же я отсутствует, почему код из переопределенного метода все еще работает здесь? Является ли это переопределенным, как в C++? Большое спасибо.

+0

Хм, да, теперь я вижу похожие вопросы о 'super', будет ли он работать правильно, если я не позволю родительскому методу? В любом случае, спасибо за ваш ответ. Это помогает. –

+0

Если я наследую «FormView», мне нужно дублировать слишком много логинов из родительского класса, я надеялся избежать этого, но лучше сделать здесь «copypaste», верно? –

+0

Спасибо, Сельджук. –

ответ

1

Потому что вы звоните super() в FormViewB, что означает метод form_validFormViewA. Если вы не хотите видеть 'in FormViewA' вы должны либо

  1. Не называйте super() вообще: В этом случае, вы должны быть уверены, что супер не включает в себя важный код, вам потребуется. Потому что, когда вы пропускаете вызов FormViewA.super(), вы также не вызываете FormView.super().

  2. Унаследовать непосредственно от FormView. Если у вас есть общий код в FormViewA и FormViewB, вы можете извлечь этот код для другого метода.

Смежные вопросы