我的项目中有多个应用:
app2 / templates / overview.index.html有以下代码:
{% extends 'base.html' %}
所以它应该扩展app2/templates/base.html
但实际上它扩展了app1/templates/base.html
!为什么以及如何解决它?
答案 0 :(得分:2)
app模板加载器返回匹配的第一个模板,它不知道你正在渲染模板' inside'一个特定的应用程序。
您将应用模板放在myapp/templates/myapp
而非myapp/templates/
中的Django docs recommend。这可以防止模板发生冲突。
现在我们可以将我们的模板直接放在
polls/templates
中(而不是创建另一个polls子目录),但这实际上是个坏主意。 Django将选择它找到的第一个名称匹配的模板,如果你在不同的应用程序中有一个同名的模板,Django将无法区分它们。我们需要能够将Django指向正确的,并且确保这一点的最简单方法是通过命名它们。也就是说,将这些模板放在为应用程序本身命名的另一个目录中。
因此,在您的情况下,您将结构更改为
然后,您必须更新视图中的模板名称,例如
return render(request, 'app2/some_template.html', {})
并在您的模板中
{% extends 'app2/base.html' %}
答案 1 :(得分:2)
为什么呢?因为这就是发现django模板的方式。
Django将在每个应用的模板目录中搜索模板(以便在INSTALLED_APPS
中显示应用)和全局模板目录中的模板。首先找到模板将被提供。这允许一个应用程序使用其他的模板。它还允许更改另一个应用程序的模板。如果没有它,那么用自己的方式设置管理面板的方式并不容易。
如何解决?在每个应用的模板中创建子目录,并在此处保留特定于应用的模板。当然,您必须输入以下路径来访问它们:
{% extends 'app2/base.html' %}