Django:当它们已经被覆盖时不能覆盖管理模板?
Posted
技术标签:
【中文标题】Django:当它们已经被覆盖时不能覆盖管理模板?【英文标题】:Django: Can't override admin templates when they are already overridden? 【发布时间】:2012-10-18 19:52:33 【问题描述】:要向模型的 Django 管理视图添加一些内容,我想覆盖 change_form.html
模板。根据documentation,我需要在文件夹/project-path/templates/admin/appname/modelname/
中创建一个文件change_form.html
。当然,我需要确保这条路径在TEMPLATE_DIRS
中也可用。这样的文件可能如下所示:
% extends "admin/change_form.html" %
% load i18n %
% block after_field_sets %
SOME CONTENT
% endblock %
但是,我使用django-guardian 来获得对象权限。这个 Django 应用程序也覆盖了change_form.html
(效果很好——相关源似乎是here),但是 Django 没有选择我的模板扩展文件(即上面示例中的“某些内容”没有显示)。我想要覆盖的块/部分与 django-guardian 覆盖的块/部分不相同,最终我希望添加到 django-guardion 的change_form.html
和我的模板。
我在这里做错了什么?是否有可能让多个应用程序覆盖一个管理模板?
如果感兴趣,这是我的TEMPLATE_LOADERS
设置:
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader'
)
此外,django-guardian 是 INSTALLED_APPS
数组中的最后一个应用程序。
【问题讨论】:
【参考方案1】:一种可能的解决方案似乎是通过引用和覆盖 django-guardian 的模板(定义为 here)而不是 Django 的通用 change_form.html
来显式定义继承链。所以不要使用
% extends "admin/change_form.html" %
在我的自定义模板的开头,我需要使用
% extends "admin/guardian/model/change_form.html" %
我还需要扩展我的GuardedModelAdmin
子类模型以明确使用我自己的模板文件作为更改表单模板:
class MyModel(GuardedModelAdmin):
change_form_template = 'admin/appname/mymodel/change_form.html'
这行得通,但它增加了对模板和模型的明确依赖。当然,无论如何,模型都有这种依赖关系,但如果还有一个仅引用默认 change_form.html
的解决方案,我会很感兴趣——但是,我怀疑这实际上是不可能的。
【讨论】:
【参考方案2】:如果您的模板路径位于TEMPLATE_DIRS
,那么您可以颠倒您的TEMPLATE_LOADERS
的顺序。
如果您的模板在您的应用中,那么您需要在INSTALLED_APPS
数组中在 django-guardian 之后添加您的应用。
基本上,如果存在名称冲突,则将使用最后加载的模板。
【讨论】:
问题不在于覆盖模板,而是在使用第三方应用程序时覆盖它们两次 Django 不会自动合并模板,基本上你不能覆盖模板两次,但你可以在模板中添加% include "admin/guardian/model/change_form.html" %
并只使用你的。
关于你的第二点,文档和我的经验是在 INSTALLED_APPS 中将使用 Django 找到的 first 模板。因此,如果您试图从应用程序中覆盖 admin/base_site.html,您的应用程序最好先来。见docs.djangoproject.com/en/1.7/ref/templates/api/…
@mlncn 我在 2013 年写的,它对 Django 1.5 有效。不知道现在是什么状态。
它在 Django 1.11 中再次改变。现在你需要使用设置FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'
docs.djangoproject.com/en/1.11/ref/forms/renderers以上是关于Django:当它们已经被覆盖时不能覆盖管理模板?的主要内容,如果未能解决你的问题,请参考以下文章
在 django 中覆盖管理模板以添加自定义 javascript