Django:当它们已经被覆盖时,不能覆盖管理模板吗?

时间:2012-10-29 13:33:14

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

要将某些内容添加到模型的Django管理视图中,我想覆盖change_form.html模板。根据{{​​3}},我需要在文件夹change_form.html中创建文件/project-path/templates/admin/appname/modelname/。当然,我需要确保TEMPLATE_DIRS中也可以使用此路径。这样的文件看起来像这样:

{% extends "admin/change_form.html" %}
{% load i18n  %}

{% block after_field_sets %}
SOME CONTENT
{% endblock %}

但是,我使用documentation来获得对象权限。这个Django应用程序也会覆盖change_form.html(工作正常 - 相关源似乎是django-guardian),但是Django没有拿起我的模板扩展文件(即上面示例中的“SOME CONTENT”)没有显示)。我要覆盖的块/部分与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数组中的最后一个应用。

2 个答案:

答案 0 :(得分:3)

一种可能的解决方案似乎是通过引用和覆盖django-guardian的模板(定义{{​​3}})而不是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的解决方案,我会感兴趣 - 但是,我怀疑这不可能。

答案 1 :(得分:3)

如果您的模板路径位于TEMPLATE_DIRS,那么您可以改变TEMPLATE_LOADERS的顺序。

如果您的应用中有模板,那么您需要在INSTALLED_APPS数组中 django-guardian之后添加

基本上,如果存在名称冲突,则最后加载的模板将被使用。