Django: Как скрыть фреймворк Sites от Django Admin при использовании django-allauth?
Фон
У меня есть django
сервер, который использует django-allauth
для обработки логики аутентификации. Я хочу unregister
фреймворк Sites из django-admin
, другими словами, я не хочу видеть раздел Sites внутри django-admin:
Что я пробовал
Обычно я делаю одну из двух вещей:
- Unplug
django.contrib.sites
fromINSTALLED_APPS
insettings.py
- Unregister
Sites
model from within one of myadmin.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
осталась нетронутой.
Как мне этого добиться? Чего мне не хватает?
Шаги для воспроизведения ошибки
- Create a Django project with
django-allauth
installed - Create a superuser and log into Django admin
- 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()
, то все приложения уже зарегистрированы вместе со своими администраторами.