Django 为什么建议我们将模板放在project/app_name/templates/app_name/中?

Django 为什么建议我们将模板放在project/app_name/templates/app_name/中?,django,django-templates,Django,Django Templates,在django教程中,它建议使用应用程序的模板 project/app\u name/templates/app\u name 这导致他们从如下视图中被引用: class ScenarioDetails(generic.DetailView): model = Scenario template_name= "cmmods/scenario.html" INSTALLED_APPS = ( 'app1', 'app2', ) 我想了解这项建议背后的原因 我看不

在django教程中,它建议使用应用程序的模板

project/app\u name/templates/app\u name

这导致他们从如下视图中被引用:

class ScenarioDetails(generic.DetailView):
    model = Scenario
    template_name= "cmmods/scenario.html"
INSTALLED_APPS = (
    'app1',
    'app2',
)
我想了解这项建议背后的原因

我看不出在什么情况下放置模板会很糟糕

项目/应用程序名称/模板

并据此提及他们:

class ScenarioDetails(generic.DetailView):
    model = Scenario
    template_name= "scenario.html"

这项建议的背后是什么?

原因是模板需要与其他Django应用程序的模板分开,以防止冲突。这就是为什么Django应用程序中的所有模板都应保存在名为
app\u name/templates/app\u name
的目录中

例如,如果不这样做,两个具有相同模板(相同文件名)的应用程序如果在同一个Django项目中一起使用就会出现问题(如果没有额外的工作,Django将不知道要使用哪一个
home.html
文件):


根据在模板路径中包含应用程序名称的约定,您可以安全地创建和发布Django应用程序,并在其他Django项目中重用它,而无需担心会出现文件名问题。

原因是模板需要与其他Django应用程序的模板分开,以防止冲突。这就是为什么Django应用程序中的所有模板都应保存在名为
app\u name/templates/app\u name
的目录中

例如,如果不这样做,两个具有相同模板(相同文件名)的应用程序如果在同一个Django项目中一起使用就会出现问题(如果没有额外的工作,Django将不知道要使用哪一个
home.html
文件):


根据将应用程序名称包含在模板路径中的约定,您可以安全地创建和发布Django应用程序,并在其他Django项目中重用它,而无需担心会出现文件名问题。

它避免了名称冲突,并显式引用模板所在的应用程序

假设你的应用程序定义了两个非常相似的模板。实现这一点的简单方法是使用基本模板,例如
'base.html'
。这是一个非常常见的名称,其他应用程序很可能使用相同的名称。如果将此模板放在根模板文件夹中,名称将发生冲突,并且两个应用将获得相同的模板,具体取决于
已安装的\u应用中的第一个(或最后一个)

通过将每个模板放在以应用程序命名的文件夹中,可以避免这些名称冲突。仅从模板名称查找模板也更容易,如果您的应用程序使用其他应用程序中的模板,这将非常有用

假设您在
app2
应用程序中使用模板
detail.html
。Django将按照找到的顺序在所有模板文件夹中查找此模板。现在,您安装的应用程序如下所示:

class ScenarioDetails(generic.DetailView):
    model = Scenario
    template_name= "cmmods/scenario.html"
INSTALLED_APPS = (
    'app1',
    'app2',
)
Django将在以下位置查找
detail.html
文件,并选择找到的第一个文件:

/path/to/project/app1/templates/detail.html
/path/to/project/app2/templates/detail.html
即使
app2
需要
app2/templates/
中的模板文件,Django也会在
app1/templates/
中提供模板(如果存在)。您得到了错误的模板,因为(相对)名称相同


现在,如果您将模板放入
app2/templates/app2/detail.html
,那么您肯定得到了正确的模板

它避免了名称冲突,并明确引用了模板所在的应用程序

假设你的应用程序定义了两个非常相似的模板。实现这一点的简单方法是使用基本模板,例如
'base.html'
。这是一个非常常见的名称,其他应用程序很可能使用相同的名称。如果将此模板放在根模板文件夹中,名称将发生冲突,并且两个应用将获得相同的模板,具体取决于
已安装的\u应用中的第一个(或最后一个)

通过将每个模板放在以应用程序命名的文件夹中,可以避免这些名称冲突。仅从模板名称查找模板也更容易,如果您的应用程序使用其他应用程序中的模板,这将非常有用

假设您在
app2
应用程序中使用模板
detail.html
。Django将按照找到的顺序在所有模板文件夹中查找此模板。现在,您安装的应用程序如下所示:

class ScenarioDetails(generic.DetailView):
    model = Scenario
    template_name= "cmmods/scenario.html"
INSTALLED_APPS = (
    'app1',
    'app2',
)
Django将在以下位置查找
detail.html
文件,并选择找到的第一个文件:

/path/to/project/app1/templates/detail.html
/path/to/project/app2/templates/detail.html
即使
app2
需要
app2/templates/
中的模板文件,Django也会在
app1/templates/
中提供模板(如果存在)。您得到了错误的模板,因为(相对)名称相同


现在,如果您将模板放入
app2/templates/app2/detail.html
,那么您肯定得到了正确的模板

这并不完全正确:collectstatic不收集模板文件,只收集静态文件(css、js等)。但是,相同的相对名称会导致名称冲突。名称在哪里冲突?考虑到每个应用程序的base.html都在自己的模板文件夹中,有什么东西不能告诉每个应用程序应该使用哪个base.html(例如)呢?@knbk:谢谢你刷新了我的记忆,我已经更新了答案。@GreenAsJade:如果两个Django应用程序都有
base.html
,并且都位于该应用程序的
/templates/base.html
中,Django怎么知道使用哪个模板?它将遍历所有应用程序以找到模板并使用第一个模板,它没有特定的逻辑来说明要选择哪个模板。我曾想象过它会知道它是从app1视图引用的,因此需要使用app1/templates/base.html!我想你和knbk都在向我澄清模板查找器不知道它要查找哪个应用程序