Django:如何覆盖方法

时间:2018-04-04 16:28:00

标签: python django

在我的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 不使用某些特定形式。我对一些详细/解释的最佳实践感到高兴。非常感谢!

1 个答案:

答案 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)

但是,如果您确定不需要这种灵活性,或者任何可能依赖您的代码的人不需要这种灵活性,我认为这不是必要的。