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

时间:2009-06-09 16:57:35

标签: django templates django-admin django-templates override

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

  

并非每个应用或每个型号都会覆盖contrib \ admin \ templates \ admin中的每个模板。

然后列出那些可以,base.htmlbase_site.htmlindex.html - 我感兴趣的 - 不在列出的那些中。它们可以按项目覆盖,但不能按应用程序覆盖。

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

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

我理解决定只为每个应用程序制作一些可覆盖的精选模板的原因;毕竟,如果覆盖所有这些都是可能的,哪个应用程序被覆盖的管理员优先?

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

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

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

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

1 个答案:

答案 0 :(得分:1)

我认为您的目标是覆盖整个项目的模板,而不是应用程序或模型,但您不希望将模板放在项目的模板文件夹中。

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

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