Пользовательский сайт администратора Django не работает в режиме просмотра модели - PullRequest
1 голос
/ 19 мая 2019

Я реализовал пользовательский сайт администратора с пользовательским заголовком, и при просмотре видов «Дом» и «Приложение» все идет хорошо.Однако, когда я проверяю экземпляры «Model», заголовок возвращается к значению по умолчанию.

Как это исправить?Я сделал что-то не так или разумно считать это ошибкой в ​​Django?

Демонстрация проблемы

Вид приложения: good header

МодельПросмотр: bad header

MCVE

(Чтобы упростить вашу жизнь, я загрузил MCVE в GitHub, но соответствующий код указан ниже: https://github.com/gregschmit/customadminfail)

Создайте новый проект и приложение и в файле sites.py в приложении:

from django.contrib import admin


class CustomSite(admin.AdminSite):
    site_header = 'Custom Header'
    site_title = 'Custom Title'

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._registry.update(admin.site._registry)


custom_site = CustomSite('custom_admin')

Затем в настройках URL вашего проекта urls.py:

from django.contrib import admin
from django.urls import path

from adminfail.sites import custom_site

urlpatterns = [
    path('custom_admin/', custom_site.urls),
]

Кроме того, добавьте приложение к вашему INSTALLED_APPS в settings.py.

Затем, если вы создадите суперпользователя из командной строки и запустите приложение, вы увидите, что пользовательский заголовок возвращается кпо умолчанию при проверке экземпляров модели.

1 Ответ

0 голосов
/ 19 мая 2019

Хорошо, так что я наконец понял, что я делаю не так. Я копирую реестр с сайта администратора по умолчанию, но реестр представляет собой карту между моделями и их экземплярами ModelAdmin, а экземпляр ModelAdmin имеет свойство admin_site, которое сообщает Django, под каким AdminSite это было зарегистрировано. Итак, чтобы решить эту проблему, я просто скопировал ModelAdmin и установил для свойства admin_site значение CustomSite. Если вы измените другие вещи, это может быть хорошо для deepcopy, и это относительно непроверенный трюк / хак, который может иметь другие последствия, но сейчас все работает отлично.

Вот код в CustomSite:

from copy import copy
from django.apps import apps
from django.contrib import admin


class CustomSite(admin.AdminSite):
    site_header = 'Custom Header'
    site_title = 'Custom Title'

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for model,model_admin in admin.site._registry.items():
            new_model_admin = copy(model_admin)
            new_model_admin.admin_site = self
            self._registry[model] = new_model_admin


custom_site = CustomSite('custom_admin')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...