django - 我使用 super() 的建议不正确吗?

标签 django overloading python-2.7 super

我在这里看到了很多答案,其中从 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/

相关文章:

django - 重新填充 Django ChoiceField 而不重新启动服务器

django - 使用 drf-spectacular 为 django API 定义组件模式

javascript - 如何通过html更改fullcalendar io的一个字段?

TypeScript 函数重载

python - 调用保存在类属性中的函数 : different behavior with built-in function vs. 普通函数

python-2.7 - Python并行处理解压文件

jquery - Backbone .js和node.js与jQuery完全不同吗?

c# - DelegateCommand的重载方法

typescript - 为什么 TypeScript 接受重写方法的正确返回,即使它不可访问?

google-app-engine - GAE : How to use unicode characters in url