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

时间:2014-12-04 10:42:42

标签: django django-templates

在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"

这项建议的背后是什么?

2 个答案:

答案 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项目中重用它,而不必担心会出现文件名问题。