Django模板扩展了错误的模板

Posted

技术标签:

【中文标题】Django模板扩展了错误的模板【英文标题】:Django template extends wrong template 【发布时间】:2016-02-23 02:56:19 【问题描述】:

我的项目中有多个应用程序:

app1/ 模板/ base.html some_template.html 应用程序2/ 模板/ base.html 概述/ index.html

app2/templates/overview.index.html 有这个代码:

% extends 'base.html' %

所以它应该扩展app2/templates/base.html

但实际上它扩展了app1/templates/base.html!为什么以及如何解决?

【问题讨论】:

【参考方案1】:

应用模板加载器返回第一个匹配的模板,它不知道您正在渲染特定应用“内部”的模板。

Django docs recommend,您将应用的模板放入 myapp/templates/myapp,而不是 myapp/templates/。这可以防止模板发生冲突。

现在我们或许可以将模板直接放在polls/templates 中(而不是创建另一个 polls 子目录),但这实际上是个坏主意。 Django 将选择它找到的第一个名称匹配的模板,如果您在不同的应用程序中有一个具有相同名称的模板,Django 将无法区分它们。我们需要能够将 Django 指向正确的位置,而确保这一点的最简单方法是对它们进行命名空间。也就是说,将这些模板放在另一个以应用程序本身命名的目录中。

因此,在您的情况下,您可以将结构更改为

应用程序1/ 模板/ 应用程序1/ base.html some_template.html 应用程序2/ 模板/ 应用程序2/ base.html 概述/ index.html

然后您必须更新视图中的模板名称,例如

return render(request, 'app2/some_template.html', )

在你的模板中

% extends 'app2/base.html' %

【讨论】:

【参考方案2】:

为什么?因为这就是发现 django 模板的工作原理。

Django 将在每个应用程序的模板目录中搜索模板(以便应用程序出现在INSTALLED_APPS)和全局模板目录中。将提供首先找到的模板。这允许一个应用程序使用来自其他应用程序的模板。它还允许通过另一个应用程序更改一个应用程序的模板。否则,您将无法轻松地自行设置管理面板的样式。

如何解决?在每个应用程序的模板中创建子目录,并在此处保留应用程序特定的模板。当然,您必须通过输入以下路径来访问它们:

% extends 'app2/base.html' %

【讨论】:

以上是关于Django模板扩展了错误的模板的主要内容,如果未能解决你的问题,请参考以下文章

Django DRY - 如何在 Django 模板中扩展两个 .html 文件?

我们可以在 django 的单个 html 模板中扩展多个 html 吗?如果可以,那么如何?

为啥 Django 模板模式匹配错误的视图并导致 NoReverseMatch 错误?

Django模板错误?

Django 2.0 - 渲染错误的模板(没有错误)

Django 1.7 现在更改了模板的名称 TemplateDoesNotExist 错误