如何向所有管理网页添加额外的上下文?
我使用默认的 Django Admin 作为网站的管理部分。
这是管理员的网址条目:
urlpatterns = [
url(r'^admin/', admin.site.urls),
]
我的应用程序使用以下方式注册其标准视图模型:
admin.site.register(Tag, TagAdmin)
我的问题是,我想在管理模板标题栏中显示一个额外的字段,但我不知道如何添加这个额外的上下文。
我的第一个赌注是将其添加到如下所示的 url 模式中:
urlpatterns = [
url(r'^admin/', admin.site.urls, {'mycontext': '123'}),
]
但这给出了一个错误:
TypeError at /admin/tickets/event/4/change/
change_view() got an unexpected keyword argument 'mycontext'
您能给点建议吗?我真的不想修改每个 AdminModel 类,我必须插入此上下文,因为我在每个管理页面上都需要它。
谢谢。
找到解决方案,注册网址必须是:
urlpatterns = [
url(r'^admin/', admin.site.urls, {'extra_context': {'mycontext': '123'}}),
]
它是字典中的上下文字典,以
'extra_context'
作为键。
另一种技术,更复杂,但允许每个请求使用不同的上下文(可能在操作时不可用):
my_project/admin.py
(如果缺少则创建)
from django.contrib import admin
from django.contrib.admin.apps import AdminConfig
class MyAdminConfig(AdminConfig):
default_site = 'my_project.admin.MyAdminSite'
class MyAdminSite(admin.AdminSite):
def each_context(self, request):
context = super().each_context(request)
context.update({
"whatever": "this is",
"just a": "dict",
})
return context
settings.py
INSTALLED_APPS = [
...
'my_project.admin.MyAdminConfig', # replaces 'django.contrib.admin'
...
替换/扩展管理类代码取自官方文档,除了全部在一个文件中。
您可以像这样对默认管理站点进行猴子修补:
顶级
urls.py
:
from django.contrib import admin
from django.urls import include, path
...
# Store a reference to the default each_context so we don't cause an infinite loop when we override it.
base_admin_context = admin.site.each_context
def custom_admin_context(request):
context = base_admin_context(request)
# Do anything we want with the context
# Example: adding a custom sidebar nav section at the top
context["available_apps"].insert(
0,
{
"name": "Extra stuff",
"app_url": "/admin/extra/",
"has_module_perms": True,
"models": [
{
"object_name": None,
"name": "A custom admin dashboard",
"admin_url": "/admin/extra/dashboard",
}
],
},
)
return context
admin.site.each_context = custom_admin_context
...
urlpatterns = [...]
如果您已经覆盖其他默认 admin.site 值,这可能是一个低复杂度的解决方案。