Django DeletionMixin和BaseDetailView导致Mypy 0.991出现奇怪的错误

o7jaxewo  于 2022-12-20  发布在  Go
关注(0)|答案(1)|浏览(128)

所以我有一个非常简单的Django视图,基本上就是删除一个用户帐户:

class UserDeleteView(LoginRequiredMixin, SuccessMessageMixin, DeleteView):
    success_message = _("Your account has been deleted")
    success_url = reverse_lazy('account_logout')

    def get_object(self):
        return self.request.user

升级到Mypy 0.991后,我看到此错误:

error: Definition of "object" in base class "DeletionMixin" is incompatible with definition in base class "BaseDetailView"  [misc]

我一辈子都搞不懂这是什么意思,如果能帮上忙,我将不胜感激。
谢谢

zyfwsgd6

zyfwsgd61#

DeletionMixin类是为视图提供删除操作的mixinBaseDetailView类是显示单个对象的详细视图的基类。
要解决此问题,您可能需要在代码中注解变量和参数的类型,以确保Mypy正确地推断它们。例如,您可能需要指定要删除的对象的类型或详细信息视图中显示的对象的类型。
下面是一个示例,说明如何将DeletionMixinBaseDetailView类与类型注解一起使用:

from django.views.generic import DeletionMixin, BaseDetailView

from myapp.models import MyModel 

class MyDetailView(DeletionMixin, BaseDetailView):
    model = MyModel
    template_name = 'myapp/detail.html'
    success_url = reverse_lazy('account_logout')

    def delete(self, request: HttpRequest, *args: Any, **kwargs: Any)
        # Perform the delete action

在此示例中,MyDetailView类是一个详细信息视图,它显示MyModel类型的单个对象,并且它还提供了一个删除操作,该操作接受HttpRequest对象并返回HttpResponse对象。通过annotating,请求参数的类型和删除方法的返回值Mypy能够推断正确的类型,并检查代码中的类型错误。

    • 更新答案**

当您尝试定义一个继承自两个基类的类时,如果这两个基类对同一属性或方法的定义存在冲突,有时会弹出Error: Definition of "object" in base class "DeletionMixin" is incompatible with definition in base class "BaseDetailView" [misc]错误。
例如,考虑以下代码:

class DeletionMixin:
    def delete(self):
        # code to delete an object goes here
        pass

class BaseDetailView:
    def delete(self):
        # code to delete a view goes here
    pass

class MyView(DeletionMixin, BaseDetailView):
    pass

在本例中,MyView类试图从DeletionMixinBaseDetailView继承,这两个类都定义了一个delete方法,然而,这两个方法有不同的实现,所以Python解释器无法确定调用MyView.delete()时应该使用哪个方法。
若要修复此错误,您需要移除其中一个冲突的基类,或者重写派生类中的冲突方法并提供解决冲突的新实现。
例如,可以如下所示覆盖MyView类中的delete方法:

class MyView(DeletionMixin, BaseDetailView):
    def delete(self):
        # provide a new implementation that resolves the conflict
        pass

如果这个错误再次出现,我想我们必须等待,看看有人会如何解决它。

相关问题