gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:49:08 26 4
gpt4 key购买 nike

我在这里看到了很多答案,其中从 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() 中的一个吗?的预期用途?

最佳答案

是的,这是有原因的。

让我们更换您的 super使用实际的 Django 方法调用。

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com