【问题标题】:Django admin template override not workingDjango 管理模板覆盖不起作用
【发布时间】:2017-02-19 06:03:55
【问题描述】:

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',
)

我也尝试在contrib.admin 之前列出new_app,但这没有帮助。

当我将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 上移一级使其位于管理路径下时,更改显示得很好:

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
  • 嗯,我明白了为什么它不起作用......也许为什么它不起作用。您正在扩展 reversion.VersionAdmin,这可能会覆盖您的模板更改。对我来说,这是因为我正在扩展 ImportExportModelAdmin。话虽如此,我仍然不确定如何解决这个问题。

标签: django django-models django-admin


【解决方案1】:

转到第 607 页。

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

您将获得如何使用 ModelAdmin 覆盖特定模型的模板的选项。

相同(我没有比较,但看起来很相似)文档可以在 django 网站上找到:Custom template options

【讨论】:

  • 如果我添加 change_list_template = 'admin/new_app/change_list.html 我会看到该文件的一些更改,但我还需要 change_list_results.html 并且没有 ModelAdmin 修饰符我可以很容易地看到。另外,change_list.html 不应该仅通过将模板文件放在 /templates/admin/new_app/ 路径中来工作吗?
  • @iandouglas jeez,你说得对,它应该可以工作,不知道是什么问题......如果我想出了什么问题,我会告诉你的。
  • 谢谢,我很感激你能想到的任何其他尝试。
【解决方案2】:

当多个应用程序提供相同资源(模板、静态文件、管理命令、翻译)的不同版本时,INSTALLED_APPS 中最先列出的应用程序具有优先权。见docs

变化:

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

收件人:

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

new_app 中的模板现在应该位于 contrib.admin 中的模板之前。

【讨论】:

  • 我也试过这个,没有帮助。对我的问题进行了编辑,说明了这一点。不过谢谢!!
  • 你重启了吗?开发服务器自动重启是不够的。
  • 您的模板设置是否定义了loaders?我猜默认应该没问题(没有定义加载器)。 docs.djangoproject.com/en/dev/ref/templates/api/…
  • 加载器是否只在我的配置文件中?我的配置在搜索中只有几个匹配 template,我们在其中明确设置了 TEMPLATE_ROOTTEMPLATE_DIRSTEMPLATE_CONTEXT_PROCESSORS,在其中我们为第三方 SSO 添加了自定义代码。
  • 在开发 shell 中,您还可以执行以下操作:from django.template.loader import get_templateget_template('admin/change_list.html').backend.template_dirs 来检查用于查找此模板的路径。一定有其他应用优先。
【解决方案3】:

您是否尝试过在应用程序中使用模板文件夹?像这样的:

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

【讨论】:

  • 嗨,汤姆,感谢您的回答。我看到的所有教程都说模板的层次结构必须像project > templates > admin > app > change_list.html 这样不起作用。我最终采用了不同的方法,但我仍然很好奇如何让这种方法发挥作用,所以我稍后会尝试一下。
  • 在我的项目中,我按照我建议的方式进行操作,并且效果很好。值得一试。
【解决方案4】:

我知道这很旧,但我来到这里是因为我遇到了非常相似的问题。通过查看 ModelAdmin 的扩展版本,James Parker 让我走上了正轨。我有一个 Mixin 和一个重载的管理员,如下所示: 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):
    ...

希望这可能会为其他人指明在哪里寻找和一种可能的解决方法。

【讨论】:

    最近更新 更多