我在这里看到了很多答案,其中从 Django 重载给定默认方法的建议操作过程是简单地从原始方法复制代码,并将其与您的修改一起包含在所述方法的重载版本中。
例如,answer given :
class MyUpdateView(UpdateView):
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.user = self.request.user
self.object.save()
return HttpResponseRedirect(self.get_success_url())
# the default implementation of form_valid is...
# def form_valid(self, form):
# self.object = form.save()
# return HttpResponseRedirect(self.get_success_url())
因此,回答者所说的默认 form_valid
的两行实际上并不是默认代码,而是通过继承执行的代码。无论如何,他们的答案删除了 form_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自己的代码遵循这个约定。取自views/generic/edit.py
第111行:
def form_valid(self, form):
self.object = form.save()
return super(ModelFormMixin, self).form_valid(form)
这是另一个问题的回答者所指的 form_valid
的真正默认版本。
所以这个问题的核心是:有什么理由我不应该在我的项目中以这种方式使用 super()
,就像 Django 代码在内部执行的那样?对我来说,优点是如果 Django 更新这些 View 在内部工作的方式,那么我的代码(简单地扩展并继续执行 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 源代码的示例中,这是另一种情况:子级执行保存,父级执行重定向。这里没有“重叠”。
关于django - 我使用 super() 的建议不正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10293336/