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

How to enable django admin sidebar navigation in a custom view?

我有一个继承自 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": []
})

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

将应用添加到 available_apps ("available_apps": ["my_app"]) 也无济于事:

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

app_list.html template which is included in your base template requires a context variable available_apps with a structure as described here.

因为您可能无法使此包含与您的应用程序一起正常工作,您还可以覆盖基本模板中的 {% block nav-sidebar %} 并提供一些适合您的 [=20] 的 HTML =].

但毕竟,将为不同应用程序(管理员)制作的模板与您的应用程序重用可能不是一个好主意,因为很难预测它们的行为方式、它们的要求是什么以及超出维护范围长期也将是一个问题,因为它们可能会随着未来的 Django 版本而改变。

您必须在模板中包含 django admin 的默认上下文变量。这可以通过调用 each_context 函数来完成:


data.update(self.admin_site.each_context(request))

我的项目中也有自定义管理视图和模板,这很适合我。

无意中我注意到 django.contrib.admin.sites 中有一个 DefaultAdminSite 对象,它被实例化为 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))

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

AdminSiteClass = import_string(apps.get_app_config("admin").default_site)
self._wrapped = AdminSiteClass()