Пользовательская страница администратора Django теряет URLS
Я пытаюсь создать кастомизированный django-admin, с отдельной страницей, на которую ссылаются в app_list.
Я использовал https://stackoverflow.com/a/70446680 в качестве основы и могу получить пользовательскую страницу администратора. Однако, когда я возвращаюсь на главную страницу администратора, все приложения в списке app_list пропадают, кроме пользовательского.
Я могу исправить это, установив admin_urls = admin.site.get_urls(), но когда я это делаю, мой пользовательский сайт администратора больше не имеет определенного метода get_app_list (из https://stackoverflow.com/a/56476261), поэтому мой app_list в администраторе не показывает приложение 'tcptraceroute'.
from django.contrib.admin import AdminSite
class CustomAdminSite(AdminSite):
def get_urls(self):
admin_urls = super().get_urls()
print(admin_urls)
custom_urls = [
path('preferences/', views.my_view()),
]
return custom_urls + admin_urls # custom urls must be at the beginning
def get(self):
request.current_app == self.name
return super().get(request)
def get_app_list(self, request):
app_list = super().get_app_list(request)
app_list += [
{
"name": "My Custom App",
"app_label": "my_test_app",
# "app_url": "/admin/test_view",
"models": [
{
"name": "tcptraceroute",
"object_name": tcptraceroute,
"admin_url": "/admin/test_view",
"view_only": True,
}
],
}
]
return app_list
site = CustomAdminSite()
Я попробовал изменить порядок приложений в установленных приложениях, а также урлы, которые в настоящее время загружают сайт customadmin следующим образом:
path('admin/', custom_admin.site.urls),
Похоже, что определенный в настоящее время класс admin site недоступен через метод super() в подклассе. И когда я вызываю admin.site.get_urls() в подклассе, суперкласс больше не имеет метода get_app_list.
?
MTIA.
Я обнаружил, что если я установлю реестр пользовательского класса admin в реестр admin.site, то он будет работать, как ожидалось.
Код становится...
class CustomAdminSite(admin.AdminSite):
def __init__(self):
super().__init__()
self._registry = admin.site._registry
def get_urls(self):
admin_urls = super().get_urls()
custom_urls = [
path('preferences/', views.MyView.as_view(), name="preferences"),
]
return custom_urls + admin_urls # custom urls must be at the beginning
def get(self):
request.current_app == self.name
return super().get(request)
def get_app_list(self, request):
app_list = super().get_app_list(request)
app_list += [
{
"name": "My Custom App",
"app_label": "my_test_app",
# "app_url": "/admin/test_view",
"models": [
{
"name": "tcptraceroute",
"object_name": tcptraceroute,
"admin_url": "/admin/test_view",
"view_only": True,
}
],
}
]
return app_list
site = CustomAdminSite()