You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中能否从模板目录直接链接CSS?实践疑问

Django中能否直接通过普通link标签链接模板目录下的CSS文件?

我了解到Django的常规做法是将CSS文件放入static文件夹,但理论上当CSS与HTML同存于templates目录时,也可通过<link rel="stylesheet" href="styles.css">链接。

我将CSS和HTML都放在.../templates/newyear/目录下,测试使用如下代码链接CSS:

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Is it Newyear?</title>
    <link rel="stylesheet" href="styles.css">
  </head>
  <body>
    {% if newyear  %}
      <h1>YES</h1>
    {% else %}
      <h1>NO</h1>
    {% endif %}
  </body>
</html>

但通过Django运行页面时CSS未生效,直接用浏览器打开该HTML文件时CSS却正常生效,文件位置和代码均未改动。

当我将CSS移至static目录,使用如下代码链接时:

{% load static %}
<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Is it Newyear?</title>
    <link rel="stylesheet" href="{% static 'newyear/styles.css' %}">
  </head>
  <body>
    {% if newyear  %}
      <h1>YES</h1>
    {% else %}
      <h1>NO</h1>
    {% endif %}
  </body>
</html>

通过Django运行页面时CSS正常生效。想咨询:在Django中是否可以不使用static标签,直接通过普通link标签链接模板目录下的CSS文件?


答案

不建议这么做,而且默认配置下也无法直接实现,原因如下:

  • Django的templates目录是专门用于存放动态模板文件的,Django的视图系统只会负责渲染这些模板,不会将templates目录作为静态资源的服务目录。当你通过Django运行页面时,浏览器请求styles.css时,Django的URL路由找不到对应的处理规则,会返回404错误,导致CSS加载失败;而直接用浏览器打开本地HTML文件时,是通过文件系统直接读取同目录的CSS,所以能正常生效。
  • 即便通过自定义URL路由配置,让Django服务templates目录下的静态文件,这也违反了Django的设计规范,会带来诸多问题:
    • 混淆了模板与静态资源的职责边界,模板用于动态生成HTML,静态资源是无需渲染的静态文件,两者应该分离管理
    • 不利于后续静态资源的优化(如缓存、压缩、CDN部署等),static目录的设计就是为了方便这些操作
    • 存在安全风险,可能导致模板文件被意外暴露给外部访问

正确做法

严格遵循Django的官方规范:

  1. 将CSS、JS、图片等静态资源统一放在static目录下(可按应用划分子目录,比如static/newyear/)
  2. 在模板中通过{% load static %}加载静态资源标签,再用{% static '路径' %}来引用静态文件,这样无论开发环境还是生产环境,Django都会自动处理静态资源的路径,确保正常加载。

内容的提问来源于stack exchange,提问作者longsushi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 04:52:10