Django模板扩展了错误的模板

时间:2015-11-20 14:58:34

标签: django django-templates

我的项目中有多个应用:

  • APP1 /
    • 模板/
      • base.html文件
      • some_template.html
  • APP2 /
    • 模板/
      • base.html文件
      • 概览/
        • 的index.html

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

{% extends 'base.html' %}

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

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

2 个答案:

答案 0 :(得分:2)

app模板加载器返回匹配的第一个模板,它不知道你正在渲染模板' inside'一个特定的应用程序。

您将应用模板放在myapp/templates/myapp而非myapp/templates/中的Django docs recommend。这可以防止模板发生冲突。

  

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

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

  • APP1 /
    • 模板/
      • APP1 /
        • base.html文件
        • some_template.html
  • APP2 /
    • 模板/
      • APP2 /
        • base.html文件
        • 概览/
          • 的index.html

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

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

并在您的模板中

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

答案 1 :(得分:2)

为什么呢?因为这就是发现django模板的方式。

Django将在每个应用的模板目录中搜索模板(以便在INSTALLED_APPS中显示应用)和全局模板目录中的模板。首先找到模板将被提供。这允许一个应用程序使用其他的模板。它还允许更改另一个应用程序的模板。如果没有它,那么用自己的方式设置管理面板的方式并不容易。

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

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