Django模板扩展了错误的模板
Posted
技术标签:
【中文标题】Django模板扩展了错误的模板【英文标题】:Django template extends wrong template 【发布时间】:2016-02-23 02:56:19 【问题描述】:我的项目中有多个应用程序:
app1/ 模板/ base.html some_template.html 应用程序2/ 模板/ base.html 概述/ index.htmlapp2/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 吗?如果可以,那么如何?