4

要将一些内容添加到模型的 Django 管理视图中,我想覆盖change_form.html模板。根据文档,我需要在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 %}

但是,我使用django-guardian来获得对象权限。这个 Django 应用程序也覆盖change_form.html(工作正常——相关源似乎在这里),但 Django 没有选择我的模板扩展文件(即上面示例中的“某些内容”没有显示)。我要覆盖的块/部分与 django-guardian 覆盖的块/部分不同,最终我希望添加change_form.htmldjango-guardion我的模板。

我在这里做错了什么?是否有可能让多个应用程序覆盖一个管理模板?

如果感兴趣,这是我的TEMPLATE_LOADERS设置:

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader'
)

此外,django-guardian 是INSTALLED_APPS数组中的最后一个应用程序。

4

2 回答 2

5

一种可能的解决方案似乎是通过引用和覆盖 django-guardian 的模板(在此处定义)而不是 Django 的 general来显式定义继承链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-但是,我怀疑这实际上是不可能的。

于 2012-10-29T14:43:04.463 回答
3

如果模板的路径位于 中TEMPLATE_DIRS,那么您可以反转TEMPLATE_LOADERS.

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

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

于 2013-09-13T06:47:46.827 回答