如何在自定义视图中启用 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()
我有一个继承自 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()