Django FormView继承

时间:2016-03-10 02:17:07

标签: python django django-class-based-views

我是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 ++中一样被覆盖?非常感谢你。

1 个答案:

答案 0 :(得分:1)

因为您在super()中呼叫FormViewB,这意味着form_valid的{​​{1}}方法。如果您不想看{4},那么

  1. 根本不要致电FormViewA:在这种情况下,您必须确保super不包含您需要的任何关键代码。因为当您跳过调用'in FormViewA'时,您也没有调用super()

  2. 直接从FormViewA.super()继承。如果您在FormView.super()FormView中都有公共代码,则可以将此代码提取到另一种方法。