为我的应用程序之外的单个模型覆盖 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
目录中。
【讨论】:
试过了,不工作...如果我把它放在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