我是python和django的新手,有人可以在基于django / python类的视图中解释我的继承机制吗?示例如下:
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
的{{1}}的代码仍会运行,我会看到此输出:
FormViewA
请解释一下,我错过了什么,为什么来自重写方法的代码仍然在这里工作?它是否像在c ++中一样被覆盖?非常感谢你。
答案 0 :(得分:1)
因为您在super()
中呼叫FormViewB
,这意味着form_valid
的{{1}}方法。如果您不想看{4},那么
根本不要致电FormViewA
:在这种情况下,您必须确保super不包含您需要的任何关键代码。因为当您跳过调用'in FormViewA'
时,您也没有调用super()
。
直接从FormViewA.super()
继承。如果您在FormView.super()
和FormView
中都有公共代码,则可以将此代码提取到另一种方法。