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

Gre*_*ade 1 django django-templates

在 django 教程中,建议将应用程序的模板放入

project/app_name/templates/app_name

这导致它们被这样的视图引用:

class ScenarioDetails(generic.DetailView):
    model = Scenario
    template_name= "cmmods/scenario.html"
Run Code Online (Sandbox Code Playgroud)

我想了解这个建议背后的原因。

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

project/app_name/templates

并这样引用它们:

class ScenarioDetails(generic.DetailView):
    model = Scenario
    template_name= "scenario.html"
Run Code Online (Sandbox Code Playgroud)

这个建议的背后是什么?

knb*_*nbk 5

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

假设您的应用程序定义了几个非常相似的模板。实现此目的的一个简单方法是使用基本模板,例如'base.html'. 这是一个很常见的名称,其他应用程序很可能使用相同的名称。如果您将此模板放入根模板文件夹中,则名称会发生​​冲突,并且两个应用程序都会获得相同的模板,具体取决于哪个应用程序在您的INSTALLED_APPS.

通过将每个模板放入以您的应用程序命名的文件夹中,您可以避免这些名称冲突。仅通过模板名称即可更轻松地找到模板,如果您的应用程序使用其他应用程序的模板,这将非常有用。

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

INSTALLED_APPS = (
    'app1',
    'app2',
)
Run Code Online (Sandbox Code Playgroud)

detail.htmlDjango 将在以下位置查找该文件,并选择找到的第一个文件:

/path/to/project/app1/templates/detail.html
/path/to/project/app2/templates/detail.html
Run Code Online (Sandbox Code Playgroud)

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

现在,如果您将模板放入 中app2/templates/app2/detail.html,则可以确定您获得了正确的模板。