直接写 href="style.css" 一定失败,因为 Django 的 templates/ 目录仅用于服务端渲染,不提供 HTTP 访问;浏览器发起的是相对 URL 请求(如 /about/style.css),而该路径未在 Django 路由中配置,且静态文件必须通过 {% static %} 标签结合 STATICFILES_DIRS 和 STATIC_URL 才能正确解析并提供服务。

为什么直接写 href="style.css" 一定失败
Django 的模板目录(templates/)只用于服务端渲染,不对外提供 HTTP 访问。浏览器请求 href="style.css" 时,实际发的是相对当前 URL 的请求(比如 /about/style.css),而 Django 根本没注册这个路径——它不会自动扫描或响应任何未明确配置的静态路径。
-
href="style.css"和href="./style.css"都无效,不是“少个斜杠”问题,是根本不在 Django 的静态服务范围内 - 即使文件真放在
templates/static/style.css,Django 也完全无视——它只认STATICFILES_DIRS列表里声明的目录 - 错误现象:页面无样式、浏览器控制台报
GET /style.css 404或GET /about/style.css 404
{% load static %} 不是可选,是硬性前提
模板引擎默认不认识 {% static %},不显式加载就用,结果只有两种:Invalid block tag 报错,或者原样输出字符串(比如页面上直接显示 {% static 'css/style.css' %}),根本不会生成有效链接。
- 必须写在模板最顶部,不能包在
{% if %}、{% for %}或其他块内 - 一行只能加载一个标签库:
{% load static %}✅,{% load static url %}❌(Django ≥ 4.0 已废弃) - 每个要用
{% static %}的模板都得单独写这行,无法“继承”或全局生效
{% static 'css/style.css' %} 路径怎么写才对
{% static %} 只做字符串拼接:把 STATIC_URL(如 /static/)和你传的参数连起来。它不解析路径、不校验文件是否存在,写错就 404。
- ✅ 正确:
{% static 'css/style.css' %}→ 输出/static/css/style.css - ❌ 错误:
{% static '/css/style.css' %}→ 开头斜杠会被截掉,语义混乱,易误判;且若STATIC_URL是/assets/,结果变成/assets/css/style.css,但你本意可能是想跳过前缀 - ❌ 错误:
href="{% static 'css/style.css' %}/"→ 多了个斜杠,变成/static/css/style.css//,必然 404 - 路径是相对于
STATICFILES_DIRS所指目录的子路径,不是相对于模板位置。比如STATICFILES_DIRS = [BASE_DIR / "static"],那文件就得在static/css/style.css
开发能跑通,上线全 404 的关键断点
本地 runserver 能加载 CSS,是因为开发服务器靠 urls.py 里手动追加的 static() 路由“打补丁”;生产环境(Nginx + Gunicorn)下 Django 完全不处理静态请求,全靠 Web 服务器直供。
立即学习“前端免费学习笔记(深入)”;
- 上线前必须运行
python manage.py collectstatic,否则所有{% static %}渲染出的路径都指向空目录 -
STATIC_ROOT必须是绝对路径,且不能和STATICFILES_DIRS重叠,否则collectstatic会报错或覆盖源文件 - Nginx 配置必须精确映射:
location /static/ { alias /var/www/myproject/staticfiles/; }—— 注意结尾斜杠和路径一致性 - 漏掉
django.contrib.staticfiles在INSTALLED_APPS中,{% load static %}会静默失败(不报错但不生效)
STATICFILES_DIRS 指向的目录里到底有没有那个文件、大小写对不对、collectstatic 跑没跑、Nginx 的 alias 少没少斜杠——这些细节一错,{% static %} 再规范也没用。


















