自定义Django管理页面丢失URLS



我正在尝试创建一个自定义的django管理员,在app_list中引用一个单独的页面。

我用过https://stackoverflow.com/a/70446680作为基础,可以获得自定义的管理页面。然而,当我返回管理员主页时,除了自定义应用程序外,app_list中的所有应用程序都会丢失。

我可以通过设置admin_urls = admin.site.get_urls()来解决这个问题,但当我这样做时,我的自定义管理站点不再定义get_app_list方法(从https://stackoverflow.com/a/56476261),所以我在admin中的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()

我已经尝试在已安装的应用程序中重新排列我的应用程序订单,以及我的URL,它们目前按照加载customadmin网站

path('admin/', custom_admin.site.urls),

当前定义的管理站点类似乎无法通过子类中的super()方法访问。当我在子类中调用admin.site.get_urls()时,超级类不再有get_app_list方法。

MTIA。

我发现,如果我将自定义管理类的注册表设置为admin.site的注册表,那么它将按预期工作。

代码变为。。。

在管理员.py

from django.contrib import admin
from django.urls import path
from . import views
class CustomAdminSite(admin.AdminSite):

def get_urls(self):
self._registry = admin.site._registry
admin_urls = super().get_urls() 
custom_urls = [
path('preferences/', views.Preferences.as_view(admin=self), 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 Preferences App",
"app_label": "Preferences",
# "app_url": "/admin/test_view",
"models": [
{
"name": "Preferences",
"object_name": "preferences",
"admin_url": "/admin/preferences",
"view_only": True,
}
],
}
]
return app_list
site = CustomAdminSite()

视图。。。

class Preferences(views.generic.ListView):
admin = {}
def get(self, request):
ctx = self.admin.each_context(request)
return render(request, 'admin/preferences/preferences.html', ctx)

模板。。。

{% extends "admin/base_site.html" %}
{% block content %}
...HELLO WORLD!
{% endblock %}

最新更新