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覆盖模板静态文件位置

在 django 中覆盖管理模板以添加自定义 javascript

覆盖django中的管理模板以添加自定义javascript

上下文未传递给被覆盖的模板

管理员模板覆盖忽略的标题栏

Django:覆盖每个应用程序而不是每个项目的“不可覆盖”管理模板?