Django: Как скрыть фреймворк Sites от Django Admin при использовании django-allauth?

Фон

У меня есть django сервер, который использует django-allauth для обработки логики аутентификации. Я хочу unregister фреймворк Sites из django-admin, другими словами, я не хочу видеть раздел Sites внутри django-admin:

Django-admin current state

Что я пробовал

Обычно я делаю одну из двух вещей:

  1. Unplug django.contrib.sites from INSTALLED_APPS in settings.py
  2. Unregister Sites model from within one of my admin.py files like so: admin.site.unregister(Sites)

Проблема

Я пробовал делать оба вышеуказанных варианта. Вот ошибка, когда я отсоединяю приложение Sites от INSTALLED_APPS:

...
  File "C:\path-to-my-project\venv\lib\site-packages\allauth\utils.py", line 13, in <module>
    from django.contrib.sites.models import Site
  File "C:\path-to-my-project\venv\lib\site-packages\django\contrib\sites\models.py", line 78, in <module>
    class Site(models.Model):
  File "C:\path-to-my-project\venv\lib\site-packages\django\db\models\base.py", line 113, in __new__
    raise RuntimeError(
RuntimeError: Model class django.contrib.sites.models.Site doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.

django-allauth явно использует его в строке 13.

Вот ошибка, когда я делаю admin.sites.unregister(Site):

Exception in thread django-main-thread:
Traceback (most recent call last):
  File "C:\Program Files\Python39\lib\threading.py", line 973, in _bootstrap_inner
    self.run()
  File "C:\Program Files\Python39\lib\threading.py", line 910, in run
    self._target(*self._args, **self._kwargs)
  File "C:\path-to-my-project\venv\lib\site-packages\django\utils\autoreload.py", line 64, in wrapper
    fn(*args, **kwargs)
  File "C:\path-to-my-project\venv\lib\site-packages\django\core\management\commands\runserver.py", line 110, in inner_run
    autoreload.raise_last_exception()
  File "C:\path-to-my-project\venv\lib\site-packages\django\utils\autoreload.py", line 87, in raise_last_exception
    raise _exception[1]
  File "C:\path-to-my-project\venv\lib\site-packages\django\core\management\__init__.py", line 375, in execute
    autoreload.check_errors(django.setup)()
  File "C:\path-to-my-project\venv\lib\site-packages\django\utils\autoreload.py", line 64, in wrapper
    fn(*args, **kwargs)
  File "C:\path-to-my-project\venv\lib\site-packages\django\__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "C:\path-to-my-project\venv\lib\site-packages\django\apps\registry.py", line 122, in populate
    app_config.ready()
  File "C:\path-to-my-project\venv\lib\site-packages\django\contrib\admin\apps.py", line 27, in ready
    self.module.autodiscover()
  File "C:\path-to-my-project\venv\lib\site-packages\django\contrib\admin\__init__.py", line 24, in autodiscover
    autodiscover_modules('admin', register_to=site)
  File "C:\path-to-my-project\venv\lib\site-packages\django\utils\module_loading.py", line 47, in autodiscover_modules
    import_module('%s.%s' % (app_config.name, module_to_search))
  File "C:\Program Files\Python39\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 850, in exec_module
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "C:\path-to-my-project\accounts\admin.py", line 94, in <module>
    admin.site.unregister(Site)
  File "C:\path-to-my-project\venv\lib\site-packages\django\contrib\admin\sites.py", line 153, in unregister
    raise NotRegistered('The model %s is not registered' % model.__name__)
django.contrib.admin.sites.NotRegistered: The model Site is not registered

Проблема в том, что django-allauth для правильной работы требуется фреймворк Sites. Вот официальное объяснение:

settings.py (Важно - Обратите внимание, что 'django.contrib.sites' требуется как INSTALLED_APPS):

Что я хочу

Все, что я хочу, это скрыть раздел сайтов из django-admin, так как он мне не нужен. Я не хочу отключать или удалять регистрацию, потому что я хочу, чтобы функциональность django-allauth осталась нетронутой. Как мне этого добиться? Чего мне не хватает?

Шаги для воспроизведения ошибки

  1. Create a Django project with django-allauth installed
  2. Create a superuser and log into Django admin
  3. Try to hide the sites framework from Django admin

Один из подходов заключается в том, чтобы снять регистрацию Site администратора в одной из ваших AppConfig.ready() функций следующим образом:

from django.apps import AppConfig


class SomeAppConfig(AppConfig):
    # ...

    def ready(self):
        from django.contrib import admin
        from django.contrib.sites.models import Site
        admin.site.unregister(Site)

Ошибка возникает потому, что выполнение функции unregister на одном из ваших admin.py не гарантирует, что регистрация для django.contrib.sites уже завершилась. Если сделать это в функции ready(), то все приложения уже зарегистрированы вместе со своими администраторами.

Вернуться на верх