You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Mypy 0.991后,Django的DeletionMixin与BaseDetailView兼容错误

问题原因与解决方案

错误本质

这个错误源于Mypy 0.991加强了多重继承场景下的属性兼容性检查:DeleteView同时继承DeletionMixin和BaseDetailView,两个基类对object属性的类型定义存在冲突——DeletionMixin要求object是确定存在的Model实例,而BaseDetailView默认会将其推断为可选类型(Optional[Model]),Mypy因此判定两者定义不兼容。

解决方法

方法一:明确模型与返回类型注解

给视图指定model属性,并给get_object方法添加精确的返回类型注解,让Mypy能正确推断类型,消除冲突:

from django.contrib.auth.models import User  # 使用自定义用户模型则导入对应类
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.messages.views import SuccessMessageMixin
from django.views.generic.edit import DeleteView
from django.urls import reverse_lazy
from django.utils.translation import gettext_lazy as _

class UserDeleteView(LoginRequiredMixin, SuccessMessageMixin, DeleteView):
    success_message = _("Your account has been deleted")
    success_url = reverse_lazy('account_logout')
    model = User  # 指定视图关联的模型

    def get_object(self) -> User:  # 明确返回当前用户的类型
        return self.request.user

方法二:临时忽略Mypy错误(不推荐长期使用)

若需快速临时解决,可在get_object的返回行添加忽略注释:

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  # type: ignore[misc]

方法三:通过get_queryset限定范围(可选)

另一种方式是用get_queryset限定查询范围,配合get_object的默认逻辑,帮助Mypy正确推断类型:

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

    def get_queryset(self):
        return self.request.user.__class__.objects.filter(pk=self.request.user.pk)

内容的提问来源于stack exchange,提问作者garyj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 13:15:33