python 为每个Django管理页面添加上下文

gk7wooem  于 2023-02-11  发布在  Python
关注(0)|答案(2)|浏览(139)

如何向所有管理员网页添加额外的上下文?
我使用默认的Django Admin作为我的管理部分。
下面是admin的url条目:

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

vddsk6oq

vddsk6oq1#

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

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

它是字典内部的上下文字典,以'extra_context'作为键。

bkkx9g8r

bkkx9g8r2#

另一种技术更复杂,但允许每个请求有不同的上下文(可能在OP时不可用):
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'
    ...

replace / extend admin类代码取自官方文档,只是这些代码都在一个文件中。

相关问题