Django base.html扩展约定

时间:2015-03-28 19:15:53

标签: python django django-templates django-views

对于较新版本的Django,建议将静态文件和模板保存在应用程序名称所指定的目录中。对于例如对于旧版本的Django,应用程序的结构看起来像这样:

app
├── admin.py
├── __init__.py
├── models.py
├── static
│   └── design.css
├── templates
│   ├── base.html
│   └── index.html
├── tests.py
└── views.py

而对于较新版本,建议的结构如下:

app
├── admin.py
├── __init__.py
├── models.py
├── static
│   └── app
│       └── design.css
├── templates
│   └── app
│       ├── base.html
│       └── index.html
├── tests.py
└── views.py

现在,我应该如何根据较新的应用布局访问应用视图中的静态文件和模板?也就是说,在视图中访问模板名称时,对应用程序的名称进行硬编码是个好主意吗?

def index(request):
    return render(request, 'blog/index.html', {})

同样,在扩展index.html的模板base.html中,需要按如下方式引用它:

{% extends "blog/base.html" %}

同样,这涉及在模板中硬编码应用程序的名称。这是个好主意吗?如果我决定重命名该应用程序,我需要对这么多文件进行更改。

或者,我错过了任何允许我将base.html称为

的设置
{% extends "base.html" %}

在我的模板中,同时避免提及应用名称?

2 个答案:

答案 0 :(得分:3)

这与django的新版本或旧版本无关,这与collectstatic命令将覆盖相似名称的文件有关;添加应用名称会为静态文件创建“命名空间”。

您只应对静态文件执行此操作,模板应位于应用程序的主“模板”目录中;当然,如果你有不属于某个应用程序的模板,它们应该放在一个单独的目录中(在TEMPLATE_DIRS中添加到settings.py)。

模板由TEMPLATE_LOADERS设置加载;默认设置是通过遍历TEMPLATE_DIRS中的目录搜索文件系统,然后在任意template目录中搜索已安装的应用程序 - 这些应用程序按照INSTALLED_APPS中列出的顺序进行搜索

将使用与请求的模板匹配的第一个模板。这样可以轻松地随应用程序一起发布默认模板,然后允许最终用户自定义它们;通过创建具有相同名称的模板并将其放在TEMPLATE_DIRS中列出的目录中。

为避免任何可能的冲突,最好将您的应用名称添加到模板本身;因此,如果您有index.html且您的应用名为foo,请将模板更改为foo_index.html(默认设置)。

答案 1 :(得分:0)

我认为在模板中硬编码应用程序的名称是一个好主意,因为您可能有多个应用程序具有相同名称的模板。如果您只是放置模板的名称,Django将使用该名称的第一个模板(如果您有多个具有相同名称的模板,这可能是错误的。)