必须在模板顶部添加 {% load static %},否则 {% static %} 标签无法识别,导致 CSS 加载失败或报错;路径需写为 'css/style.css'(不以 / 或 ./ 开头),且文件必须真实存在于 STATICFILES_DIRS 指定目录中。

直接写 href="style.css" 或漏掉 {% load static %},CSS 就一定不会加载——Django 不会把模板目录当静态资源服务器,也不会自动识别 {% static %} 标签。
必须在模板顶部加 {% load static %}
这是硬性前提。Django 模板引擎默认不认识 {% static %},不声明就用,要么报错 Invalid block tag,要么原样输出字符串(比如页面里出现 {% static 'css/style.css' %} 这段文字),浏览器自然请求不到。
-
{% load static %}必须出现在模板最上方,不能包在{% if %}、{% for %}里 - 一行只能加载一个标签库,
{% load static url %}在 Django ≥ 4.0 已失效 - 多个模板共用同一个静态文件?每个要用
{% static %}的模板都得单独加这行,不能“继承”或“全局生效”
路径写法:别以 / 开头,也别套错引号
{% static %} 做的是纯字符串拼接:把 STATIC_URL(比如 /static/)和你传的参数连起来。它不解析路径、不校验文件是否存在,所以写错就 404。
- ✅ 正确:
{% static 'css/style.css' %}→ 输出/static/css/style.css - ❌ 错误:
{% static '/css/style.css' %}→ 开头斜杠会被 Django 截掉,实际还是/static/css/style.css,但语义混乱,容易误判 - ❌ 错误:
href="{% static 'css/style.css' %}/"→ 多了个斜杠,变成/static/css/style.css//,404 - 路径是相对于
STATICFILES_DIRS下的目录,不是相对于模板文件位置
settings.py 和目录结构必须对得上
你写的路径能拼出 URL,不代表文件真在那里。Django 开发时靠 STATICFILES_DIRS 列表去磁盘找文件,配错或目录不存在,请求照样 404。
立即学习“前端免费学习笔记(深入)”;
-
STATICFILES_DIRS必须是列表,例如[BASE_DIR / "static"];写成字符串或元组(如("css", ...))会导致静默失败 - CSS 文件得真实放在
static/css/style.css(即STATICFILES_DIRS所指目录下的子路径),而不是templates/static/或myapp/templates/static/ -
STATIC_URL必须以/结尾,否则拼接时可能丢掉分隔符,比如STATIC_URL = 'static'+'css/style.css'→staticcss/style.css - 检查
INSTALLED_APPS是否包含django.contrib.staticfiles;漏了它,{% load static %}会静默失败
开发 vs 生产:collectstatic 是绕不过的坎
本地 runserver 能加载 CSS,上线后突然 404?大概率是忘了跑 python manage.py collectstatic。
- 开发阶段:Django 动态扫描
STATICFILES_DIRS,实时提供文件 - 生产阶段:Web 服务器(Nginx/Apache)只认
STATIC_ROOT目录下的文件,collectstatic负责把所有散落的静态文件(包括各 app 的static/)复制过去 -
STATIC_ROOT不能和STATICFILES_DIRS指向同一目录,否则collectstatic会报错并拒绝执行 - 线上 Nginx 配置里,
location /static/的alias必须精确指向STATIC_ROOT对应的磁盘路径
最容易被忽略的其实是路径语义:CSS 文件里的 @import 或 background: url(...) 是按 CSS 文件自身位置算相对路径的,跟 Django 模板无关;{% static %} 只管 HTML 中那一行 href 或 src 的生成。


















