在django教程中,它建议应用程序的模板进入
project/app_name/templates/app_name
导致它们被引用来自这样的视图:
class ScenarioDetails(generic.DetailView):
model = Scenario
template_name= "cmmods/scenario.html"
我想了解这项建议背后的内容。
我看不出将模板放入
会导致什么情况变坏 project/app_name/templates
并且如此引用它们:
class ScenarioDetails(generic.DetailView):
model = Scenario
template_name= "scenario.html"
这项建议的背后是什么?
答案 0 :(得分:2)
它避免了名称冲突,它明确地引用了模板所在的应用程序。
假设您的应用定义了几个非常相似的模板。实现此目的的一种简单方法是使用基本模板,例如'base.html'
。这是一个非常常见的名称,很可能其他应用程序使用相同的名称。如果您将此模板放在根模板文件夹中,名称会发生冲突,并且两个应用都会获得相同的模板,具体取决于INSTALLED_APPS
中的第一个(或最后一个)。
通过将每个模板放在以您的应用程序命名的文件夹中,可以避免这些名称冲突。从模板名称中找到模板也更容易,如果您的应用使用其他应用的模板,这非常有用。
假设您使用detail.html
应用中的模板app2
。 Django将按照找到的顺序在所有模板文件夹中查找此模板。现在,您安装的应用程序如下所示:
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
中,则可以确保获得正确的模板。
答案 1 :(得分:1)
原因是模板需要与其他Django应用程序的模板分开以防止冲突。这就是Django应用程序中的所有模板都应保存在名为app_name/templates/app_name
的目录中的原因。
例如,如果没有这样做,两个具有相同模板(相同文件名)的应用程序如果在同一个Django项目中一起使用就会出现问题(没有额外的工作,Django不会知道其中的哪一个{{ 1}}要使用的文件):
home.html
由于在模板路径中包含应用程序名称的约定,您可以安全地创建和发布Django应用程序并在其他Django项目中重用它,而不必担心会出现文件名问题。