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

ImportError: cannot import name 'SetPasswordMixin' from partially initialized module 'django.contrib.auth.forms' (most likely due to a circular import)

Open andersk opened this issue 4 months ago • 1 comments

Bug report

django_stubs_ext.monkeypatch() now tries to import django.contrib.auth.forms, but in some cases that breaks due to import cycles.

pyproject.toml

[project]
name = "django-stubs-test"
version = "0.1.0"
requires-python = ">=3.12"
dependencies = [
    "django>=5.2.3",
    "django-stubs>=5.2.1",
    "django-stubs-ext>=5.2.1",
    "mypy>=1.16.1",
]

[tool.mypy]
plugins = [
    "mypy_django_plugin.main",
]

[tool.django-stubs]
django_settings_module = "my_settings"

my_settings.py

import django_stubs_ext
django_stubs_ext.monkeypatch()

AUTH_USER_MODEL = "my_app.MyUser"
INSTALLED_APPS = [
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "my_app",
]

my_app/__init__.py

my_app/models.py

from django.contrib.auth.models import AbstractUser


class MyUser(AbstractUser):
    pass

test.py

import os

os.environ["DJANGO_SETTINGS_MODULE"] = "my_settings"

import django.contrib.auth.forms

Output

$ uv run test.py
Traceback (most recent call last):
  File "/tmp/test/test.py", line 5, in <module>
    import django.contrib.auth.forms
  File "/tmp/test/.venv/lib/python3.13/site-packages/django/contrib/auth/forms.py", line 7, in <module>
    from django.contrib.auth.models import User
  File "/tmp/test/.venv/lib/python3.13/site-packages/django/contrib/auth/models.py", line 5, in <module>
    from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
  File "/tmp/test/.venv/lib/python3.13/site-packages/django/contrib/auth/base_user.py", line 43, in <module>
    class AbstractBaseUser(models.Model):
    ...<123 lines>...
            )
  File "/tmp/test/.venv/lib/python3.13/site-packages/django/db/models/base.py", line 131, in __new__
    app_config = apps.get_containing_app_config(module)
  File "/tmp/test/.venv/lib/python3.13/site-packages/django/apps/registry.py", line 260, in get_containing_app_config
    self.check_apps_ready()
    ~~~~~~~~~~~~~~~~~~~~~^^
  File "/tmp/test/.venv/lib/python3.13/site-packages/django/apps/registry.py", line 137, in check_apps_ready
    settings.INSTALLED_APPS
  File "/tmp/test/.venv/lib/python3.13/site-packages/django/conf/__init__.py", line 81, in __getattr__
    self._setup(name)
    ~~~~~~~~~~~^^^^^^
  File "/tmp/test/.venv/lib/python3.13/site-packages/django/conf/__init__.py", line 68, in _setup
    self._wrapped = Settings(settings_module)
                    ~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/tmp/test/.venv/lib/python3.13/site-packages/django/conf/__init__.py", line 166, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "/nix/store/2mab9iiwhcqwk75qwvp3zv0bvbiaq6cs-python3-3.13.3/lib/python3.13/importlib/__init__.py", line 88, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/test/my_settings.py", line 2, in <module>
    django_stubs_ext.monkeypatch()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/tmp/test/.venv/lib/python3.13/site-packages/django_stubs_ext/patch.py", line 129, in monkeypatch
    _get_need_generic(),
    ~~~~~~~~~~~~~~~~~^^
  File "/tmp/test/.venv/lib/python3.13/site-packages/django_stubs_ext/patch.py", line 107, in _get_need_generic
    from django.contrib.auth.forms import SetPasswordMixin, SetUnusablePasswordMixin
ImportError: cannot import name 'SetPasswordMixin' from partially initialized module 'django.contrib.auth.forms' (most likely due to a circular import) (/tmp/test/.venv/lib/python3.13/site-packages/django/contrib/auth/forms.py)

System information

  • OS: NixOS 25.11
  • python version: 3.13.3
  • django version: 5.2.3
  • mypy version: 1.16.1
  • django-stubs version: 5.2.1
  • django-stubs-ext version: 5.2.1

andersk avatar Jun 18 '25 02:06 andersk