【问题标题】:Django: Can't override admin templates when they are already overridden?Django:当它们已经被覆盖时不能覆盖管理模板?
【发布时间】: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 数组中的最后一个应用程序。

【问题讨论】:

    标签: python django django-templates django-admin django-guardian


    【解决方案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
      猜你喜欢
      • 2013-01-23
      • 2019-05-02
      • 2018-10-22
      • 2017-02-19
      • 2018-05-22
      • 2013-07-13
      • 2018-02-01
      • 2014-12-09
      • 2015-04-15
      相关资源
      最近更新 更多