为我的应用程序之外的单个模型覆盖 django 管理员更改表单?

Posted

技术标签:

【中文标题】为我的应用程序之外的单个模型覆盖 django 管理员更改表单?【英文标题】:Override django admin change form for a single model outside of my app? 【发布时间】:2016-12-11 03:10:12 【问题描述】:

我目前在我的应用程序中覆盖change_form.html,方法是将其放入:

myproject/myapp/templates/admin/change_form.html

这很好,但我真的只想覆盖User 模型的更改表单,没有别的。如果我把它放进去,它似乎不起作用:

myproject/myapp/templates/admin/user/change_form.html

我猜这是因为 User 模型不是来自我的应用程序?

在某些其他应用(即django.contrib.auth应用)中,为特定模型覆盖change_list.html的最简洁方法是什么?


来自settings.py的相关sn-ps:

TEMPLATES = [
    
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'OPTIONS': 
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'unicorn.context_processors.site_url',
                'unicorn.context_processors.consultant_data',
                'unicorn.context_processors.branding',
            ],
            'builtins': ['tracking.templatetags.tracking_extras'],
            'loaders': [
                'django.template.loaders.filesystem.Loader',
                'django.template.loaders.app_directories.Loader',
            ],
        ,
    ,
]

【问题讨论】:

【参考方案1】:

看起来您需要将应用程序名称添加到模板的完整路径中,所以应该是

myproject/myapp/templates/admin/<b>myapp/</b>user/change_form.html

【讨论】:

【参考方案2】:

settings.py

TEMPLATES = [
    
        'BACKEND': ...,
        'DIRS': [
            os.path.join(BASE_DIR, 'templates'),
        ],
        ...
    
]

admin/auth/user/change_form.html 放在项目的templates 目录中。

Overriding admin templates。

【讨论】:

试过了,不工作...如果我把它放在admin/auth/change_form.html,但如果我把它放在admin/auth/user/change_form.html,它就不行。我还在我的问题中添加了TEMPLATES 的价值。【参考方案3】:

对于 Django 3.2+ 首先你需要在你的项目中创建一个类似的管理模板结构目录:

- project_dir
- app
- templates/admin/ <---
- venv

然后复制change_form.html 来自venv/lib/python[ver]/site-packages/dajngo/contrib/admin/templates/ 进入:/templates/admin/change_form.html 这是您项目中的模板文件夹 这假设如果你使用 virtualenv

然后将settings.py 设置为:

import os
...
TEMPLATES = [
    
        ...
        'DIRS': [os.path.join(BASE_DIR, 'templates/')],
        'APP_DIRS': True,
        ...

然后你可以修改你已经复制的/templates/admin/change_form.html, 例如,您只想为用户模型显示一些文本,您可以执行以下操作:

查找行:% block field_sets % 并在该行下方:

% if opts.model_name == "user" % Put Your Text Here % endif %

所以它看起来像这样:

% block field_sets %
% if opts.model_name == "user" % Put Your Text Here % endif %

您可以将user 替换为您想要的任何型号。

【讨论】:

【参考方案4】:

晚了 4 年,但任何人都在寻找答案-- 如果您像我一样安装了 Grappelli 软件包,您的问题可以通过转到 python/lib/site-packages/grappelli 并在那里查找 change_form.html 来解决。这个包覆盖了我的自定义模板,所以我对 grappelli 文件进行了更改。

【讨论】:

以上是关于为我的应用程序之外的单个模型覆盖 django 管理员更改表单?的主要内容,如果未能解决你的问题,请参考以下文章

仅针对某些模型覆盖 Django 管理员 change_list_results.html

将模型范围的帮助文本添加到 django 模型的管理表单

Django - 覆盖 Model.create() 方法?

如何使用 django 为我的案例设计模型?

Django:如何覆盖 form.save()?

django 模型创建连接到 mssql