Автоматическая регистрация моделей Django auth с использованием настраиваемого админ-сайта
Я реализовал управление проверкой подлинности с использованием Django auth с административным сайтом по умолчанию, но затем я хотел использовать свой собственный AdminSite для перезаписи некоторых типов поведения:
class OptiAdmin(admin.AdminSite):
site_title = "Optimizer site admin"
#...Other stuff here
Затем зарегистрировались мои собственные модели:
admin_site = OptiAdmin(name='opti_admin')
admin.site.register(MyModel, MyModelAdmin)
#Other stuff here
Но когда я иду на админ-сайт, я могу видеть только те модели, которые я только что зарегистрировал, что звучит справедливо для меня, но я хотел бы видеть все другие модели приложений на этом новом пользовательском сайте, включая пользователей и группы auth и я не знаю, как это сделать автоматически, как это делает администратор по умолчанию, PLS Help:).
Ответы
Ответ 1
- Создайте свой собственный AdminSite с помощью простого
__init__()
переопределения.
- Импортируйте своего администратора в
urls.py
.
Замена администратора Django и получение поведения autodiscover()
возможны с минимальными усилиями. Здесь структура проекта, сгенерированная в типичном django-admin startproject project
модуле:
project/
manage.py
project/
__init__.py
settings.py
urls.py
wsgi.py
admin.py # CREATE THIS FILE
project/admin.py: (я думаю, что это имеет смысл сделать это на уровне проекта.)
from django.contrib.admin import * # PART 1
class MyAdminSite(AdminSite):
site_header = "My Site"
def __init__(self, *args, **kwargs):
super(MyAdminSite, self).__init__(*args, **kwargs)
self._registry.update(site._registry) # PART 2
site = MyAdminSite()
project/urls.py(фрагмент):
from . import admin # PART 3
urlpatterns = [
url(r'^admin/', admin.site.urls),
]
Часть 1 - простой Python. Импортируя все из django.contrib.admin
в ваше пространство имен, оно действует как замена для замены. Я полагаю, вам не нужно это делать, но это помогает сохранить ожидания. Часть 3, просто подключите своего администратора. Часть 2 - настоящий трюк. Как говорится в документации , autodiscover()
вызывается для выполнения этой работы. Все автообнаружение выполняется через INSTALLED_APPS
, пытаясь импортировать файл с именем admin.py
. Импорт запускает код, конечно, и этот код делает то же самое, что вы делаете для регистрации моделей (пример decorator и пример ). Никакой магии. Вам не нужно регистрировать свои модели у своего настроенного администратора (как говорится в документации).
Автообнаружение выглядит умнее, чем с register_to
kwarg. Это указывает на то, что вы можете вызвать autodiscover() самостоятельно, проходя свой собственный администратор. Неа; там нет проводки (будущая функция?). Назначение происходит здесь и фиксируется в собственном экземпляре AdminSite здесь (или здесь с помощью декоратора). Регистры Django Contrib регистрируются на этом экземпляре, а также любые сторонние библиотеки. Это не то, что вы можете подключить.
Здесь трюк, _registry
- это просто сопоставление словаря. Пусть Django автоматически обнаруживает все вещи, а затем просто копирует отображение. Вот почему работает self._registry.update(site._registry)
. "self" - это ваш индивидуальный экземпляр AdminSite, "сайт" - это экземпляр Django, и вы можете также зарегистрировать свои модели.
(Заключительное примечание: если модели отсутствуют, это из-за заказа на импорт. Вся регистрация для Django AdminSite должна произойти до того, как вы скопируете _registry
. Регистрация непосредственно вашим настроенному администратору, вероятно, самая простая вещь.)
Ответ 2
Документы Django предлагают использовать SimpleAdminConfig
с помощью специального сайта администратора.
INSTALLED_APPS = (
...
'django.contrib.admin.apps.SimpleAdminConfig',
...
)
Это предотвращает регистрацию моделей по умолчанию AdminSite
.
Документы, похоже, предполагают, что вы будете импортировать модели отдельно и добавить их на свой пользовательский сайт:
from django.contrib.auth.models import Group, User
from django.contrib.auth.admin import GroupAdmin, UserAdmin
admin_site.register(Group, GroupAdmin)
admin_site.register(User, UserAdmin)
Это будет очень многократно, если у вас есть модели во многих приложениях. Он не предлагает каких-либо советов, как автоматически регистрировать модели из всех ваших приложений с помощью своего сайта.
Вы можете попробовать патч обезьяны admin
и заменить admin.site
на свой собственный.
from django.contrib import admin
admin.site = OptiAdmin(name='opti_admin')
Затем, когда код называется admin.site.register()
, он зарегистрирует модель с вашим сайтом администратора. Этот код должен был запускаться до регистрации любых моделей. Вы можете попробовать поместить его в AppConfig
для своего приложения и убедиться, что ваше приложение выше django.contrib.admin
.
Ответ 3
Добавление в JCotton отличный ответ:
Используя django 2.0, переопределение site_header
и site_title
на пользовательском сайте администратора работает только для страницы index
.
Чтобы заставить его работать со всеми представлениями администратора, расширьте код JCotton следующим образом:
def __init__(self, *args, **kwargs):
super(MyAdminSite, self).__init__(*args, **kwargs)
self._registry.update(site._registry) # PART 2
for model, model_admin in self._registry.items():
model_admin.admin_site = self
Ответ 4
Просто включите метод init в свой класс CustomAdminSite следующим образом.
class CustomAdminSite(admin.AdminSite):
def __init__(self, *args, **kwargs):
super(CustomAdminSite, self).__init__(*args, **kwargs)
self._registry.update(admin.site._registry)