Невозможно переопределить оба contrib.admin.AdminSite и django.contrib.auth.admin.Пользователь администратор одновременно

#python #django #django-admin

#python #django #django-admin

Вопрос:

Используя Django 3.1 и Python 3.6, я пытаюсь переопределить класс AdminSite по умолчанию и UserAdmin. Я пытаюсь объединить примеры из двух разных разделов документации:

Переопределение сайта администратора по умолчанию

Расширение существующей модели пользователя

Первоначально у меня был только переопределенный класс 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'
  

Спасибо!

Комментарии:

1. Любопытно.. что произойдет, если вы измените свое приложение с именем core на что-то другое, например, «mycore»?

2.@tbm был болен, поэтому просто нашел время для этого. К сожалению, это ничего не дало (но это было в конечном итоге). В итоге я выяснил, что изменение импорта в настройках с BaseCustomAdmin на AdminConfig , похоже,, решило мою проблему.

Ответ №1:

Я случайно исправил это, вернувшись к проблеме 3 недели спустя и потратив на это 5 минут. Я изменил строку в settings.py из

 'core.apps.CoreCustomAdmin',
  

Для

 'base.apps.AdminConfig',
  

Причина, по которой это base.apps вместо core.apps , заключается в том, что я переименовал приложение в «base» в соответствии с комментарием к вопросу, в попытке решить проблему. Если бы я этого не сделал, это было бы просто изменение CoreCustomAdmin на AdminConfig .

Насколько я могу судить, это достигло желаемого эффекта. У него все еще есть как пользовательский заголовок на сайте администратора, так и встроенный на странице редактирования модели пользователя.