在我的Django应用程序中,我有时必须覆盖方法。我的问题是,是否有类似于"最佳实践"在如何覆盖方法。
示例:在我的项目中,我有以下课程。
class AuthorCreate(CreateView):
model = Author
form_class = AuthorForm
template_name = 'app/create_author.html'
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.creator = self.request.user
self.object.save()
return super().form_valid(form)
所以我在这里覆盖了form_valid()
方法。它有效,我认为这是正确的。但是,这是好的做法,例如,我经常看到这样的事情:
def overridden_method(self, *args, **kwargs):
#Some logic here
pass
那么,我应该这样做吗?
def form_valid(self, form, *args, **kwargs):
self.object = form.save(commit=False)
self.object.creator = self.request.user
self.object.save()
return super().form_valid(form)
所以我的问题基本上是 WHEN 我应该使用 WHICH "模板"对于重写方法或 WHEN 不使用某些特定形式。我对一些详细/解释的最佳实践感到高兴。非常感谢!
答案 0 :(得分:2)
这实际上取决于您要覆盖的方法,但经验法则是检查文档以查找要覆盖的方法。特别是模型上的save()
方法和其他方法。您需要*args
和**kwargs
某些方法的原因不是因为它是"模板"但更多是因为Django在运行方法时传递了其他参数和关键字参数,如果省略*args
和**kwargs
,可能会意外遗漏。
如果你看一下Django的save()
方法,你会发现默认情况下会传递大量的关键字参数。
让我们看一下抽象模型的例子。如果您将其覆盖为:
class SomeAbstractModel(models.Model):
field = models.CharField(max_length=55)
class Meta:
abstract = True
def save(self):
super().save()
您基本上不允许任何继承此模型的人传递任何关键字参数来覆盖save()
方法上的Django默认关键字参数。在这种情况下,写一个更好的做法是:
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
但是,如果您确定不需要这种灵活性,或者任何可能依赖您的代码的人不需要这种灵活性,我认为这不是必要的。