django-stubs icon indicating copy to clipboard operation
django-stubs copied to clipboard

False positive when using mixins with DeleteView

Open monosans opened this issue 3 years ago • 1 comments

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

  • OS: Arch Linux
  • python version: 3.10.8
  • django version: 4.1.3
  • mypy version: 0.982
  • django-stubs version: 1.13.0
  • django-stubs-ext version: 0.7.0

monosans avatar Nov 03 '22 16:11 monosans

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

adamchainz avatar Nov 11 '22 09:11 adamchainz