在一个网页中,不仅仅只有一个html骨架,还需要css样式文件、js执行文件以及一些图片等。在DTL中,使用 static
标签来加载静态文件,使用static标签时,首先需要 {% load static %}
。
必要条件
加载静态资源文件的必要条件:
- 确保
django.contrib.staticfiles
已经添加到 settings 的INSTALLED_APPS
中(默认已添加)。 - 确保在settings.py中设置了
STATIC_URL
(一般在最后一行)。 - 在
INSTALLED_APPS
中添加app的名字。 - 在已经安装了的app下创建一个
static
目录,再在这个static下创建一个当前app名字的文件夹,然后再把静态文件放到这个文件夹下。(如果不这样做,若其他 app下也有static,将根据在INSTALLED_APPS
中添加的先后顺序进行加载。)
例如你的app叫做book,有一个静态文件叫做logo.jpg,那么路径为book/static/book/logo.jpg。
为什么在app下创建一个static文件夹,还需要在这个static下创建一个同app名字的文件夹呢?
原因是如果直接把静态文件放在static文件夹下,那么在模板加载静态文件的时候就是使用logo.jpg,如果在多个app之间有同名的静态文件,这时候可能就会产生混淆。
而在static文件夹下加了一个同名app文件夹,在模板中加载的时候就是使用app/logo.jpg,这样就可以避免产生混淆。
其他情况
如果有一些静态文件不和任何app挂钩,那么可以在settings.py中添加
STATICFILES_DIRS
,以后DTL就会在这个列表的路径中查找静态文件。STATICFILES_DIRS = [
os.path.join(BASE_DIR,"static")
]
在模板中使用load标签加载static标签:
```python {% load static %} {# 加载在项目的static文件夹下的style.css的文件:static/style.css #}
{# 加载在项目的static下项目名字下的style.css的文件:static/front/style.css,front为app名字 #}
以上两种情况,分别适用static目录在项目名字内和在项目名字外。
3. 如果不想每次在模板中加载静态文件都使用load加载static标签,那么可以在settings.py中的 `TEMPLATES/OPTIONS` 添加 `'builtins':['django.templatetags.static']` :
```python
TEMPLATES = [
{
………………
'OPTIONS': {
'builtins':['django.templatetags.static'],
'context_processors': [
………………
],
},
},
]
这样以后在模板中就可以直接使用static标签,而不用手动的load了。
- 如果没有在settings的
INSTALLED_APPS
中添加django.contrib.staticfiles
。那么就需要手动的将请求静态文件的url与静态文件的路径进行映射了。
```python from django.conf import settings from django.conf.urls.static import static
urlpatterns = [
# 其他的url映射
] + static(settings.STATIC_URL, document_root=settings.STATICFILES_DIRS[0]) ```