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

问题描述 投票:0回答:3

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

我使用默认的 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 类,我必须插入此上下文,因为我在每个管理页面上都需要它。

谢谢。

python django django-admin django-views
3个回答
9
投票

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

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

它是字典中的上下文字典,以

'extra_context'
作为键。


5
投票

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

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'
    ...

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


0
投票

您可以像这样对默认管理站点进行猴子修补:

顶级

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 值,这可能是一个低复杂度的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.