Django管理模板覆盖未生效

8

Django 1.6.11

应用程序的结构如下:

my_project/
     |-- new_app/
     |-- templates/

在我的配置文件中:

TEMPLATE_ROOT = os.path.join(BASE_ROOT, 'templates/')
TEMPLATE_DIRS = (
    TEMPLATE_ROOT,
)
INSTALLED_APPS = (
    'django.contrib.admin',
    ...
    'new_app',
)

我还尝试将new_app列在contrib.admin之前,但没有帮助。

当我将venv/django/contrib/admin/templates/admin/change_list.html复制到我的/templates/admin/new_app/change_list.html中时,我没有看到我自定义的内容显示出来。

my_project/
     |-- new_app/
     |-- templates/
         |-- admin/
             |-- new_app/
                 |-- change_list.html

当我将change_list.html上移一级,使其位于admin路径下时,更改就可以正常显示:
my_project/
     |-- new_app/
     |-- templates/
         |-- admin/
             |-- change_list.html
             |-- new_app/   (now an empty folder)

...但是这意味着我的更改将影响到每个管理员页面,而不仅仅是我尝试修改的应用程序。

我已经将这个内容添加到admin.py中唯一的模型中:

class MyModelAdmin(reversion.VersionAdmin):
    change_list_template = 'admin/new_app/change_list.html'

这提供了我需要的一部分内容,但我还需要change_list_results.html,而且没有相应的ModelAdmin覆盖。

我正在遵循文档指南,该指南位于第31页的2.4.8部分,网址为readthedocs,但似乎没有成功。


我知道这是一个非常老的问题。但是我在Django 2.1.1上几乎遇到了完全相同的问题。你是否解决了这个问题,因为下面的解决方案都对我不起作用。我也试图针对特定模型执行此操作,该模型位于单独的项目中。我的文件夹结构类似: my_project/ |-- api/ |-- frontend/ |-- templates/ |-- admin/ |-- api/ |-- specificmodel/ |-- change_list.html - James Parker
2
我找到了为什么它不起作用的原因...也许这就是为什么它不起作用的原因。你正在扩展reversion.VersionAdmin,这可能会覆盖你的模板更改。对我来说,这是因为我正在扩展ImportExportModelAdmin。话虽如此,我仍然不确定如何解决这个问题。 - James Parker
4个回答

20

当几个应用程序提供相同资源(模板,静态文件,管理命令,翻译)的不同版本时,INSTALLED_APPS 中排名第一的应用优先。详见 文档

更改后:

INSTALLED_APPS = (
    'django.contrib.admin',
    ...
    'new_app',
)

收件人:

INSTALLED_APPS = (
    'new_app',
    'django.contrib.admin',
    ...
)

现在new_app中的模板应该在contrib.admin中的模板之前被找到。


我也尝试过这个,但没有帮助。我在问题中写了一篇编辑声明。谢谢! - iandouglas
1
你重启了吗?开发服务器自动重启不够。 - allcaps
TEMPLATE_CONTEXT_PROCESSORS 是无关的,它们只在请求响应周期中起作用。 如果这些位置包含 change_list.html,则 TEMPLATE_ROOT 和 _DIRS 可能会产生影响。 修改 django.contrib.admin 的 change_list.html(路径/到/站点-页面/django/contrib/admin/templates)以临时查看是否使用该模板。 - allcaps
非常感谢您的想法!顺便提一下,在我的帖子中提到,如果我将/templates/admin/new_app/中的change_list.htmlchange_list_results.html上移一级到/templates/admin/,它就可以正常工作(但这会影响所有内容)。是的,我已经三次检查了我的应用程序名称和相应的/templates/admin/*/路径的拼写。 :) - iandouglas
1
在开发 shell 中,您还可以执行类似以下的操作:from django.template.loader import get_templateget_template('admin/change_list.html').backend.template_dirs 来检查用于查找此模板的路径。必须有其他应用程序具有优先权。 - allcaps
显示剩余6条评论

4
您尝试过在应用程序中使用模板文件夹吗?类似于这样的内容:
my_project/
     |-- new_app/
         |-- templates/
             |-- new_app/
                 |-- admin/
                     |-- change_list.html
     |-- templates/

1
嗨Tom,感谢你的回答。我看过的所有教程都说模板的层次结构必须像project > templates > admin > app > change_list.html这样,但这并没有起作用。最终我采取了不同的方法,但我仍然很想知道如何让这种方式工作,所以稍后我会尝试一下这个方法。 - iandouglas
1
在我的项目中,我按照我建议的方式进行操作,效果很好。值得一试。 - Tom Brock
它对我没有起作用。 - Darwin

0

我知道这个帖子很旧了,但我来到这里是因为我遇到了一个非常类似的问题。James Parker通过查看ModelAdmin的扩展版本让我找到了正确的方向。我有一个Mixin和一个重载的Admin,如下所示:class EvaluationAdmin(ExportMixin, MarkdownxModelAdmin):。结果发现ExportMixin正在硬编码模板,导致无法覆盖正常的模板。我没有在其他地方找到解决方案,虽然这可能不是最优雅的方法,但我通过创建ExportMixin的子类并将模板硬编码为我的覆盖模板来修复了它。只需确保使用mixin时始终从其副本开始,以保留它所提供的任何其他功能(在此例中为'admin/import_export/change_list_export.html')。

class EvaluationExportMixin(ExportMixin):
    change_list_template = 'admin/eval/evaluation/change_list_export.html'

class EvaluationAdmin(EvaluationExportMixin, MarkdownxModelAdmin):
    ...

希望这可以指引其他人去寻找解决方案并提供一种可能的解决方法。

-1

前往第607页。

自定义模板选项 覆盖管理模板 部分介绍了如何覆盖或扩展默认的管理模板。使用以下选项来覆盖 ModelAdmin 视图使用的默认模板:

在那里,您将获得有关如何使用 ModelAdmin 覆盖特定模型的模板的选项。

相同的(我没有比较,但似乎相似)文档可以在 Django 网站上找到:自定义模板选项


如果我添加change_list_template = 'admin/new_app/change_list.html',我可以看到来自该文件的一些更改,但我还需要change_list_results.html,并且我无法立即看到该模型管理器修改器。此外,change_list.html不是应该通过在/templates/admin/new_app/路径中拥有模板文件来工作吗? - iandouglas
@iandouglas 哎呀,你说得对,它应该能够工作,不知道问题出在哪里... 如果我有想法,我会告诉你的。 - vishes_shell
谢谢,我感激你能想到的任何其他尝试。 - iandouglas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接