簡體   English   中英

Django:如何在使用 django-allauth 時從 Django 管理員隱藏站點框架?

[英]Django: How to hide Sites framework from Django Admin while using django-allauth?

背景

我有一個使用django-allauth處理身份驗證邏輯的django服務器。 我想從django-admin unregister站點框架,換句話說,我不想看到 django-admin 中的站點部分:

Django-admin 當前狀態

我試過的

通常,我會做以下兩件事之一:

  1. settings.py中的INSTALLED_APPS中拔下django.contrib.sites
  2. 從我的admin.py文件之一中取消注冊Sites model,如下所示: admin.site.unregister(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需要站點框架才能正常工作。 以下是官方解釋

settings.py(重要 - 請注意 'django.contrib.sites' 是 INSTALLED_APPS 所必需的):

我想要的是

我想要的只是從 django-admin 隱藏站點部分,因為我沒有用它。 我不想拔掉或取消注冊,因為我希望django-allauth的功能完好無損。 我如何實現這一目標? 我錯過了什么?

重現錯誤的步驟

  1. 創建一個安裝了django-allauth的 Django 項目
  2. 創建超級用戶並登錄 Django admin
  3. 嘗試對 Django 管理員隱藏站點框架

一種方法是在您的AppConfig.ready()函數之一上取消注冊Site管理員,如下所示:

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)

發生錯誤是因為在您的 admin.py 之一上進行注銷將不能保django.contrib.sites admin.py的注冊已經完成。 ready() function 中執行此操作將起作用,因為所有應用程序都已與其管理員一起注冊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM