对于较新版本的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" %}
在我的模板中,同时避免提及应用名称?
答案 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将使用该名称的第一个模板(如果您有多个具有相同名称的模板,这可能是错误的。)