0

Django 文档清楚地说明了以下内容:

并非每个应用程序或每个模型都可以覆盖 contrib\admin\templates\admin 中的每个模板。

然后它列出了那些可以,和base.htmlbase_site.htmlindex.html——我感兴趣的——不在列出的那些之中。它们可以被每个项目覆盖,但不能被每个应用覆盖。

我的问题是:有没有办法不涉及编辑 django.contrib.admin 中的代码?我愿意考虑一些猴子补丁解决方案:-)。我真的希望我的应用程序在其templates目录中拥有这三个文件的自定义版本,并让每个使用该应用程序的项目都使用这些文件。

我感兴趣的原因是我正在创建一个具有高度自定义管理界面的大型可重用应用程序,并且每个项目覆盖“核心”模板并不是最好的解决方案,因为我必须复制将自定义模板添加到使用该应用程序的每个项目的模板目录中。发布对这些核心模板进行新修改的应用程序的新版本意味着将所有内容重新复制到受影响的项目中。啊。

我理解决定只为每个应用程序覆盖少数几个模板的原因;毕竟,如果可以覆盖所有这些,那么哪个应用程序的覆盖管理员会优先?

但就我而言,该应用程序将成为多个客户项目的“核心”,而这些项目中的其他应用程序仅起支持作用。

对现有模板的基于 CSS 的自定义只能让您到目前为止,除非绝对必要,否则我不愿依赖 JavaScript DOM 操作解决方案。

想到的一种解决方案是将自定义base.html等模板放在 appname/templates/admin/ 中,然后将它们符号链接到项目的模板文件夹。这样,对应用程序的任何更新都将自动在项目级别生效。

如果没有更好的建议,符号链接可能是我选择的方法,但我想听听是否有人有更好的解决方案。

4

1 回答 1

1

正如我所见,您的目标是覆盖整个项目的模板,而不是应用程序或模型,但您不想将模板放在项目的模板文件夹中。

所以你应该在'your_app/templates/admin'文件夹中创建'base.html'等。接下来,您必须告诉 django 模板不仅应该从项目的模板文件夹中加载,还应该从您的应用程序文件夹中加载。这可以使用TEMPLATES_DIRsettings.py 文件中的变量 smth 来完成。像那样:

TEMPLATE_DIRS = (
    os.path.join(PROJECT_PATH, 'templates'),
    os.path.join(PROJECT_PATH, 'my_app','templates'),
)
于 2009-06-09T17:10:37.283 回答