无法同时覆盖contrib.admin.AdminSite和Django.contrib.auth.admin.UserAdmin

2024-09-28 01:29:21 发布

您现在位置:Python中文网/ 问答频道 /正文

使用Django3.1和Python3.6,我试图覆盖默认的AdminSite类和UserAdmin。我试图结合文档中两个不同部分的示例:

Overriding the default admin site

Extending the existing User model

最初我只是重写了AdminSite类,但是当我试图重写UserAdmin时,问题出现了

这两者都是独立工作的。我可以覆盖AdminSite并获取自定义标题,也可以覆盖UserAdmin并获取内联显示

不管出于什么原因,我遇到了一个导入错误:ImportError: Module "core.admin" does not define a "CoreCustomAdmin" attribute/class。它看起来像是一种循环依赖,但这只是一种猜测,因为我不知道它发生在哪里/如何发生

堆栈跟踪:

Exception in thread django-main-thread:
Traceback (most recent call last):
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/utils/module_loading.py", line 20, in import_string
    return getattr(module, class_name)
AttributeError: module 'core.admin' has no attribute 'CoreCustomAdmin'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/utils/module_loading.py", line 44, in autodiscover_modules
    if register_to:
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/utils/functional.py", line 240, in inner
    self._setup()
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/contrib/admin/sites.py", line 540, in _setup
    AdminSiteClass = import_string(apps.get_app_config('admin').default_site)
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/utils/module_loading.py", line 17, in import_string
    module = import_module(module_path)
  File "/usr/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/home/infernous/project_name/src/core/admin.py", line 2, in <module>
    from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/contrib/auth/admin.py", line 26, in <module>
    class GroupAdmin(admin.ModelAdmin):
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/contrib/admin/decorators.py", line 21, in _model_admin_wrapper
    if not isinstance(admin_site, AdminSite):
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/utils/functional.py", line 240, in inner
    self._setup()
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/contrib/admin/sites.py", line 540, in _setup
    AdminSiteClass = import_string(apps.get_app_config('admin').default_site)
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/utils/module_loading.py", line 24, in import_string
    ) from err
ImportError: Module "core.admin" does not define a "CoreCustomAdmin" attribute/class

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/utils/module_loading.py", line 20, in import_string
    return getattr(module, class_name)
AttributeError: module 'core.admin' has no attribute 'CoreCustomAdmin'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/lib/python3.6/threading.py", line 916, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.6/threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/utils/autoreload.py", line 53, in wrapper
    fn(*args, **kwargs)
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/core/management/commands/runserver.py", line 110, in inner_run
    autoreload.raise_last_exception()
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/utils/autoreload.py", line 76, in raise_last_exception
    raise _exception[1]
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/core/management/__init__.py", line 357, in execute
    autoreload.check_errors(django.setup)()
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/utils/autoreload.py", line 53, in wrapper
    fn(*args, **kwargs)
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/apps/registry.py", line 122, in populate
    app_config.ready()
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/contrib/admin/apps.py", line 24, in ready
    self.module.autodiscover()
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/contrib/admin/__init__.py", line 24, in autodiscover
    autodiscover_modules('admin', register_to=site)
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/utils/module_loading.py", line 53, in autodiscover_modules
    if register_to:
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/utils/functional.py", line 240, in inner
    self._setup()
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/contrib/admin/sites.py", line 540, in _setup
    AdminSiteClass = import_string(apps.get_app_config('admin').default_site)
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/utils/module_loading.py", line 17, in import_string
    module = import_module(module_path)
  File "/usr/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/home/infernous/project_name/src/core/admin.py", line 2, in <module>
    from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/contrib/auth/admin.py", line 26, in <module>
    class GroupAdmin(admin.ModelAdmin):
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/contrib/admin/decorators.py", line 21, in _model_admin_wrapper
    if not isinstance(admin_site, AdminSite):
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/utils/functional.py", line 240, in inner
    self._setup()
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/contrib/admin/sites.py", line 540, in _setup
    AdminSiteClass = import_string(apps.get_app_config('admin').default_site)
  File "/home/infernous/project_name/.venv/lib/python3.6/site-packages/django/utils/module_loading.py", line 24, in import_string
    ) from err
ImportError: Module "core.admin" does not define a "CoreCustomAdmin" attribute/class

事实上,我没有加载默认的管理员(这会导致错误)

settings.py

INSTALLED_APPS = [
    ...
    'core.apps.CoreCustomAdmin',
    ...
    # 'django.contrib.admin', # Commented out

问题文件?更改导入的顺序不会产生任何效果,这是意料之中的,因为它Python:

core/admin.py

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User, Group

from allauth.account.models import UserData

class CoreCustomAdmin(admin.AdminSite):
    site_header = 'Custom Header'

class UserDataInline(admin.StackedInline):
    model = UserData
    can_delete = False

class CustomUserAdmin(BaseUserAdmin):
    inlines = (UserDataInline,)

admin.site = CoreCustomAdmin()
admin.site.register(User, CustomUserAdmin)
admin.site.register(Group)

我唯一导入core.admin的地方。我曾尝试将admin.site = CoreCustomAdmin()core/admin.py更改为类似customadmin = CoreCustomAdmin()的内容并使用它,但它自然没有起到任何作用

urls.py

from django.urls import path, include

from core.admin import admin

app_name = 'project_name'
urlpatterns = [
    ...
    path('admin/', admin.site.urls),
]

core/apps.py

from django.apps import AppConfig
from django.contrib.admin.apps import AdminConfig


class CoreConfig(AppConfig):
    name = 'core'

class CoreCustomAdmin(AdminConfig):
    default_site = 'core.admin.CoreCustomAdmin'

谢谢


Tags: djangonameinpyimportprojecthomevenv
1条回答
网友
1楼 · 发布于 2024-09-28 01:29:21

3周后,我无意中修复了这个问题,花了5分钟。我将settings.py中的行从

'core.apps.CoreCustomAdmin',

'base.apps.AdminConfig',

之所以它是base.apps而不是core.apps,是因为我根据对问题的评论将应用程序重命名为“base”,以试图解决问题。如果我没有这样做的话,它只会把CoreCustomAdmin变成AdminConfig

据我所知,它达到了预期的效果。它在管理站点上仍然有自定义标题,在用户模型编辑页面上也有内联标题

相关问题 更多 >

    热门问题