Подтвердить что ты не робот

Автоматическая регистрация моделей 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:).

4b9b3361

Ответ 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)