#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
.
Насколько я могу судить, это достигло желаемого эффекта. У него все еще есть как пользовательский заголовок на сайте администратора, так и встроенный на странице редактирования модели пользователя.