Django 模板扩展了错误的模板

int*_*_32 5 django django-templates

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

  • 应用程序1/
    • 模板/
      • 基本.html
      • 一些_模板.html
  • 应用2/
    • 模板/
      • 基本.html
      • 概述/
        • 索引.html

app2/templates/overview.index.html 有以下代码:

{% extends 'base.html' %}
Run Code Online (Sandbox Code Playgroud)

所以应该延长app2/templates/base.html

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

Ala*_*air 4

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

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

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

所以在你的情况下,你可以将结构更改为

  • 应用程序1/
    • 模板/
      • 应用程序1/
        • 基本.html
        • 一些_模板.html
  • 应用2/
    • 模板/
      • 应用2/
        • 基本.html
        • 概述/
          • 索引.html

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

return render(request, 'app2/some_template.html', {})
Run Code Online (Sandbox Code Playgroud)

并在你的模板中

{% extends 'app2/base.html' %}
Run Code Online (Sandbox Code Playgroud)