Django 我建议使用super()是否不正确?

Django 我建议使用super()是否不正确?,django,overloading,python-2.7,super,Django,Overloading,Python 2.7,Super,我在这里看到了许多答案,其中推荐的从Django重载给定默认方法的做法是简单地从原始方法复制代码,并将其与所述方法的重载版本中的修改一起包含 例如,一个: 所以回答者说的两行是默认的form\u valid实际上不是默认代码,而是通过继承执行的代码。不管怎样,他们的回答删除了对form\u valid的任何Django代码的执行,并将其替换为直接的HttpResponseRedirect()调用 我编写此方法的方法如下: class MyUpdateView(UpdateView): d

我在这里看到了许多答案,其中推荐的从Django重载给定默认方法的做法是简单地从原始方法复制代码,并将其与所述方法的重载版本中的修改一起包含

例如,一个:

所以回答者说的两行是默认的
form\u valid
实际上不是默认代码,而是通过继承执行的代码。不管怎样,他们的回答删除了对
form\u valid
的任何Django代码的执行,并将其替换为直接的
HttpResponseRedirect()
调用

我编写此方法的方法如下:

class MyUpdateView(UpdateView):
    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        return super(MyUpdateView, self).form_valid(form)
Django自己的代码遵循此约定。取自
视图/generic/edit.py
第111行:

def form_valid(self, form):
    self.object = form.save()
    return super(ModelFormMixin, self).form_valid(form)
这是另一个问题的回答者所指的
form\u valid
的真实默认版本


所以这个问题的核心是:有什么理由我不应该在我的项目中以这种方式使用
super()
,就像Django的代码在内部使用一样吗?
对我来说,优点是如果Django能够更新这些视图在内部的工作方式,我的代码(只是扩展并继续执行Django的代码)保持兼容的可能性要大得多。此外,它还防止我通过简单地修改现有代码来重新编写已经编写的代码。这不是
super()
的预期用途之一吗?

是的,这是有原因的

让我们用实际的Django方法替换您的
super
调用

class MyUpdateView(UpdateView):
    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        self.object = form.save() # oops, we redefined self.object, user won't be saved
        return HttpResponseRedirect(self.get_success_url())
所以这行不通。当然,使用
super
总是更干燥更好,但这并不总是可能的


在Django source的示例中,这是另一种情况:子级执行保存,父级执行重定向。这里没有“重叠”。

这只是无效的实现。我们可以将user设置为form.instance.user,而不是创建将在父调用中重写的对象。总之,如果我们需要所有父级的功能,那么我们必须使用super,如果我们不需要某些部分或想要重新定义它们(不仅仅是添加额外的操作)-显然我们不需要super。@SimpleLizz我认为这会起作用,但我不喜欢这种方式。我们不使用
form.save(commit=True)
的结果,而是将其用作
changeinplace
方法。对于代码的可读性和理解性来说不是很好。
class MyUpdateView(UpdateView):
    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        self.object = form.save() # oops, we redefined self.object, user won't be saved
        return HttpResponseRedirect(self.get_success_url())