对于较新版本的 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
现在,我应该如何根据较新的应用程序布局访问应用程序 View 中的静态文件和模板?也就是说,在 View 中访问模板名称时,对应用名称进行硬编码是个好主意吗?
def index(request):
return render(request, 'blog/index.html', {})
同样,在扩展base.html的模板index.html中,需要引用如下:
{% extends "blog/base.html" %}
同样,这涉及在模板中对应用名称进行硬编码。这是不是一个好主意?如果我决定重命名该应用程序,我将需要对如此多的文件进行更改。
或者,我是否缺少任何允许我将 base.html 引用为
{% extends "base.html" %}
在我的模板中,同时避免提及应用名称?
请您参考如下方法:
这与 django 的新旧版本无关,这与 collectstatic 命令将覆盖相似名称的文件这一事实有关;添加您的应用名称会为您的静态文件创建一个“命名空间”。
你应该只对静态文件这样做,模板应该放在你的应用程序的主"template"目录中;当然,如果您有不属于应用程序的模板,它们应该放在单独的目录中(添加到 settings.py 中的 TEMPLATE_DIRS)。
模板由 TEMPLATE_LOADERS 加载环境;并且默认设置是通过遍历 TEMPLATE_DIRS 中的目录来搜索文件系统,然后在任何 template 目录中搜索已安装的应用程序 - 按照列出的顺序进行搜索在 INSTALLED_APPS 中。
将使用与所请求的模板匹配的第一个模板。这使得将默认模板与您的应用程序一起发布变得容易,然后允许最终用户自定义它们;通过创建具有相同名称的模板并将其放在 TEMPLATE_DIRS 中列出的目录中。
为避免任何可能的冲突,最好将您的应用程序名称添加到模板本身;因此,如果您有 index.html 并且您的应用名为 foo,请将模板更改为 foo_index.html(默认)。
