typeddjango / django-stubs

PEP-484 stubs for Django
MIT License
1.62k stars 452 forks source link

False positive when using mixins with DeleteView #1227

Open monosans opened 2 years ago

monosans commented 2 years ago

Bug report

What's wrong

After updating to version 1.13.0, I'm getting a false positive when using mixins with DeleteView. Probably this commit is related to this bug.

from django.contrib.auth.models import User
from django.forms import ModelForm
from django.views.generic import DeleteView

class DummyMixin:
    pass

class CategoryDeleteView(  # Definition of "object" in base class "DeletionMixin" is incompatible with definition in base class "BaseDetailView"  [misc]
    DummyMixin, DeleteView[User, ModelForm[User]]
):
    model = User
    success_url = ""

System information

adamchainz commented 2 years ago

Unfortunately I think this is a Mypy bug: https://github.com/python/mypy/issues/9031

The object definition on BaseDeleteView actually shouldn’t be there, since it comes from DeletionMixin. If it’s removed, the error occurs without the mixin:

diff --git a/django-stubs/views/generic/edit.pyi b/django-stubs/views/generic/edit.pyi
index 1138df7..7dccd47 100644
--- a/django-stubs/views/generic/edit.pyi
+++ b/django-stubs/views/generic/edit.pyi
@@ -67,7 +67,7 @@ class DeletionMixin(Generic[_M]):
     def get_success_url(self) -> str: ...

 class BaseDeleteView(Generic[_M, _ModelFormT], DeletionMixin[_M], FormMixin[_ModelFormT], BaseDetailView[_M]):
-    object: _M
+    pass

 class DeleteView(Generic[_M, _ModelFormT], SingleObjectTemplateResponseMixin, BaseDeleteView[_M, _ModelFormT]):
     object: _M

As a workaround, you can redeclare object in your subclass:

 class CategoryDeleteView(DummyMixin, DeleteView[User, ModelForm[User]]):
+    object: User
     model = User