向每个Django Admin页面添加上下文

时间:2016-09-13 18:08:17

标签: python django django-admin django-views

如何为所有管理网页添加额外的上下文?

我使用默认的Django Admin作为网站的管理员部分。

以下是admin的网址:

urlpatterns = [
    url(r'^admin/', admin.site.urls),
]

我的应用程序使用以下方式注册标准视图模型:

admin.site.register(Tag, TagAdmin)

我的问题是,我想在管理模板标题栏中显示一个额外的字段,我不知道如何添加这个额外的上下文。

我的第一个赌注是将其添加到下面的网址模式中:

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类,因为我需要在每个管理页面上。

感谢。

2 个答案:

答案 0 :(得分:4)

找到解决方案,网址注册必须是:

urlpatterns = [
    url(r'^admin/', admin.site.urls, {'extra_context': {'mycontext': '123'}}),
]

它是一个以'extra_context'为键的字典中的上下文字典。

答案 1 :(得分:0)

另一种技术,较为复杂,但每个请求允许使用不同的上下文(可能在OP时间不可用):

my_project/admin.py(如果缺少则创建)

from django.contrib import admin
from django.contrib.admin.apps import AdminConfig


class MyAdminConfig(AdminConfig):
    default_site = 'my_project.apps.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.apps.MyAdminConfig',  # replaces 'django.contrib.admin'
    ...

替换/扩展管理类代码取自the official docs,除了全部在一个文件中。