Django:覆盖每个应用程序而不是每个项目的“不可覆盖”管理模板?

Posted

技术标签:

【中文标题】Django:覆盖每个应用程序而不是每个项目的“不可覆盖”管理模板?【英文标题】:Django: overriding 'unoverridable' admin templates per app instead of per project? 【发布时间】:2010-11-01 13:26:12 【问题描述】:

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

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

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

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

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

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

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

对现有模板的基于 CSS 的自定义仅能帮助您到目前为止,除非绝对必要,否则我会犹豫是否依赖 javascript DOM 操作解决方案。

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

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

【问题讨论】:

【参考方案1】:

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

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

TEMPLATE_DIRS = (
    os.path.join(PROJECT_PATH, 'templates'),
    os.path.join(PROJECT_PATH, 'my_app','templates'),
)

【讨论】:

PROJECT_PATH = os.path.abspath(os.path.dirname(file)) 我的应用程序不在 PROJECT_PATH 中,但除此之外,这看起来像是一个干净的解决方案。谢谢!

以上是关于Django:覆盖每个应用程序而不是每个项目的“不可覆盖”管理模板?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Django 模型在 ExtJS 网格中获取外键值而不是键?

成功删除、添加或编辑项目的 django 消息

在方案中设置构建变量而不是目标

覆盖 Django 小部件默认模板

Django - 记录每个视图的操作

django queryset“包含”列表,而不是字符串