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

Posted

技术标签:

【中文标题】将上下文添加到每个 Django 管理页面【英文标题】:Add context to every Django Admin page 【发布时间】:2017-01-21 10:24:07 【问题描述】:

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

我对网站的管理部分使用默认的 Django 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 类,因为我在每个管理页面上都需要它。

谢谢。

【问题讨论】:

OP 的自我回答对我不起作用,可能是因为我需要访问管理员 index.html 页面上的额外数据——这确实有效(尽管它可能是多余的)@987654321 @ 【参考方案1】:

找到解决办法,url注册必须是:

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

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

【讨论】:

如果说我想添加一个特定的查询集,你知道这会被添加到什么视图中吗? 在听取了您的建议后(这解决了我试图很好解决的问题!)我发现 Django Admin 中的“更改密码”表单已损坏。这似乎是 Django 中的一个错误。毕竟,为了获得额外的上下文和更改密码表单,我不得不在单个表单上使用 Django 的 ModelAdmin 'add_view' 和 'change_view' 方法。 ***.com/a/64072756/706797【参考方案2】:

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

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

【讨论】:

ModuleNotFoundError: No module named 'my_project', when I add it in INSTALLED_APPS @MartinTaleski 这看起来像一个路径问题。请务必使用包含 wsgi.py 而不是 my_project 的目录,或者在项目根目录中创建一个新模块并使用其名称。顺便说一句,也感谢您的编辑。笨蛋我不小心点击了“回滚”,对不起。

以上是关于将上下文添加到每个 Django 管理页面的主要内容,如果未能解决你的问题,请参考以下文章

Django 动态网址

将Django Choices表单字段的详细名称传递给查看上下文

在每个页面上放置一个 django 登录表单

django_上下文管理器

使用 Ajax、Django 将上下文传递到模板中

django基础——上下文处理器