Django模板扩展了错误的模板

Django模板扩展了错误的模板,django,django-templates,Django,Django Templates,我的项目中有多个应用程序: 附件1/ 模板/ base.html 一些_template.html 附件2/ 模板/ base.html 概述/ index.html app2/templates/overview.index.html包含以下代码: {% extends 'base.html' %} 因此它应该扩展app2/templates/base.html 但实际上它扩展了app1/templates/base.html!为什么以及如何修复它?应用程序模板加载器

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

  • 附件1/
    • 模板/
      • base.html
      • 一些_template.html
  • 附件2/
    • 模板/
      • base.html
      • 概述/
        • index.html
app2/templates/overview.index.html包含以下代码:

{% extends 'base.html' %}
因此它应该扩展
app2/templates/base.html


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

应用程序模板加载器返回第一个匹配的模板,它不知道您正在“在”特定应用程序中呈现模板

建议您将应用程序的模板放入
myapp/templates/myapp
,而不是
myapp/templates/
。这可以防止模板发生冲突

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

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

  • 附件1/
    • 模板/
      • 附件1/
        • base.html
        • 一些_template.html
  • 附件2/
    • 模板/
      • 附件2/
        • base.html
        • 概述/
          • index.html
然后,您必须更新视图中的模板名称,例如

return render(request, 'app2/some_template.html', {})
在你的模板中

{% extends 'app2/base.html' %}
{% extends 'app2/base.html' %}

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

Django将在每个应用程序的模板目录中搜索模板(以便应用程序显示在
已安装的应用程序中)和全局模板目录中。将提供第一个找到的模板。这允许一个应用程序使用其他应用程序的模板。它还允许一个应用程序更改另一个应用程序的模板。没有这一点,就不会有一个简单的方式来设计自己的管理面板

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