如何在自定义视图中启用 django admin 侧边栏导航?

Kac*_*ski 6 python django django-admin

我有一个继承自 的视图,它使用模板作为基础LoginRequiredMixin, TemplateView呈现一些数据。admin/base_site.html我将它视为管理界面的一部分,因此它需要管理员登录。我想通过启用左侧的标准侧边栏导航,使此视图更多地成为 Django 管理界面的一部分。

请注意,我在任何地方都没有自定义ModelAdmin定义,我只是在某个预定义的 URL 处呈现模板。界面中也没有使用模型,它解析并显示来自与数据库无关的源的数据。

目前,我只是手动构建所需的上下文数据,例如:

data = super().get_context_data(**kwargs)
data.update(**{
    "is_popup": False,
    "site_header": None,
    "is_nav_sidebar_enabled": True,
    "has_permission": True,
    "title": "My title",
    "subtitle": None,
    "site_url": None,
    "available_apps": []
})
Run Code Online (Sandbox Code Playgroud)

侧边栏可见,但显示错误消息:

错误消息:您无权查看或编辑任何内容

将应用程序添加到available_apps( "available_apps": ["my_app"]) 也没有帮助:

渲染的侧边栏没有数据

所以我的问题是 - 我该怎么做?我可以继承一个类来实现这种行为吗?或者我可以调用一个方法来获取所有必需的上下文数据base_site.html?或者也许我应该在模板中插入一些信息?也许我需要一个AdminSite对象,或者可以以某种方式调用默认对象的方法?

Kac*_*ski 4

偶然我注意到DefaultAdminSite中有一个对象django.contrib.admin.sites,并且它被实例化为site。因此,就我而言,简单地使用site就足够了。

from django.contrib.admin import AdminSite
from django.contrib.admin.sites import site
admin_site: AdminSite = site
data.update(**admin_site.each_context(self.request))
Run Code Online (Sandbox Code Playgroud)

此外,事实证明我可以使用apps以防导入site出现问题,就像DefaultAdminSite它一样:

AdminSiteClass = import_string(apps.get_app_config("admin").default_site)
self._wrapped = AdminSiteClass()
Run Code Online (Sandbox Code Playgroud)