Django静态文件没有加载。修复settings.py以在相对路径上加载文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django静态文件没有加载。修复settings.py以在相对路径上加载文件相关的知识,希望对你有一定的参考价值。

我下载了这个模板https://github.com/BlackrockDigital/startbootstrap-resume,我试图在Django中使用它。我遇到静态文件问题,即.css和.jpg。

我的项目名为Djangoresume,应用程序是简历。我将模板文件复制到我的/ home / kinkyboy / Djangoresume / resume / templates / resume(如果您认为最后一个简历文件夹不是组织项目的常用方法,请告诉我):

> pwd
/home/kinkyboy/Djangoresume/resume/templates/resume
> tree -L1
.
├── css
├── gulpfile.js
├── img
├── js
├── index.html
├── scss
├── static
│   ├── css
│   ├── img
│   ├── js
│   ├── scss
│   └── vendor
└── vendor

请注意,我将相同的静态文件添加到新文件夹“static”以增加使Django工作的机会,但我宁愿不使用它。

这是settings.py的IMO相关部分:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
...
STATIC_URL = 'static/'
STATICFILES_DIRS = [
        os.path.join(BASE_DIR, '/resume/templates/resume/static')
]

但我尝试了很多不同的文件夹。我看到{%static%}使用STATIC_URL,而静态文件可能会使用STATICFILES_DIRS。 BASE_DIR是manage.py的地方,对吗?

我在这里复制了存储库中index.html的较短版本:

<!DOCTYPE html>
<html lang="en">
{% load static %}
{% load staticfiles %}
  <head>

    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Resume - Start Bootstrap Theme</title>

    <!-- Bootstrap core CSS -->
    <link href="vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">

    <!-- no it does not work -->
    <link href="{% static 'vendor/bootstrap/css/bootstrap.min.css' %}" rel="stylesheet">

    <!-- Custom fonts for this template -->
    <link href="https://fonts.googleapis.com/css?family=Saira+Extra+Condensed:100,200,300,400,500,600,700,800,900" rel="stylesheet">
    <link href="https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i,800,800i" rel="stylesheet">
    <link href="vendor/font-awesome/css/font-awesome.min.css" rel="stylesheet">
    <link href="vendor/devicons/css/devicons.min.css" rel="stylesheet">
    <link href="vendor/simple-line-icons/css/simple-line-icons.css" rel="stylesheet">

    <!-- Custom styles for this template -->
    <link href="css/resume.min.css" rel="stylesheet">

  </head>

  <body id="page-top">

    <nav class="navbar navbar-expand-lg navbar-dark bg-primary fixed-top" id="sideNav">
      <a class="navbar-brand js-scroll-trigger" href="#page-top">
        <span class="d-block d-lg-none">Start Bootstrap</span>
        <span class="d-none d-lg-block">
          <img class="img-fluid img-profile rounded-circle mx-auto mb-2" src="img/profile.jpg" alt="">

<!--Try using static-->
<img class="img-fluid img-profile rounded-circle mx-auto mb-2" src="{% static 'img/profile.jpg' %}" alt="">

        </span>
      </a>
      <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
      </button>
      <div class="collapse navbar-collapse" id="navbarSupportedContent">
        <ul class="navbar-nav">
          <li class="nav-item">
            <a class="nav-link js-scroll-trigger" href="#about">About</a>
          </li>
          <li class="nav-item">
            <a class="nav-link js-scroll-trigger" href="#experience">Experience</a>
          </li>
          <li class="nav-item">
            <a class="nav-link js-scroll-trigger" href="#education">Education</a>
          </li>
          <li class="nav-item">
            <a class="nav-link js-scroll-trigger" href="#skills">Skills</a>
          </li>
          <li class="nav-item">
            <a class="nav-link js-scroll-trigger" href="#interests">Interests</a>
          </li>
          <li class="nav-item">
            <a class="nav-link js-scroll-trigger" href="#awards">Awards</a>
          </li>
        </ul>
      </div>
    </nav>


    <!-- Bootstrap core JavaScript -->
    <script src="vendor/jquery/jquery.min.js"></script>
    <script src="vendor/bootstrap/js/bootstrap.bundle.min.js"></script>

    <!-- Plugin JavaScript -->
    <script src="vendor/jquery-easing/jquery.easing.min.js"></script>

    <!-- Custom scripts for this template -->
    <script src="js/resume.min.js"></script>

  </body>

</html>

这个html工作直接在浏览器中打开,就是格式很好。当用作Django的模板时,它不会。我确实尝试在任何地方使用{%static''%},如下所示:

<link href="{% static 'vendor/bootstrap/css/bootstrap.min.css' %}" rel="stylesheet">
src="{% static 'img/profile.jpg' %}"

并同时更改STATIC_URL。我甚至在STATIC_URL中有一些混合成功(一些css被应用,有些没有)和一些路径,现在它甚至很难再现(我在浏览器中禁用了缓存)。我确实在终端收到消息,例如

Not Found: /js/resume.min.js
[01/Mar/2018 18:59:45] "GET /js/resume.min.js HTTP/1.1" 404 3599

我想我的views.py,urls.py都可以,因为我可以加载index.html。只有css和jpg不加载。

如何解决这个问题?从浏览器中生成的html我不明白什么是加载的,什么不是。

答案

静态资产没有为您加载的原因是Django无法在静态文件夹中找到它们。 Django在项目中查找模板和静态文件夹,并在渲染时收集所有资源。

你可以阅读更多关于它here

您在组织模板的项目结构时是正确的。

  • 它应该是project / app / templates / app / - files--

--files--是index.html和其他* .html文件的保存位置。

但模板仅用于保留视图呈现的HTML文件。此文件夹不用于存储静态资产(即CSS,JS,其他框架文件等)。

就像模板文件夹一样,您需要为静态资产提供类似的结构。

  • 它应该是project / app / static / app / - files--

--files--这里包括所有CSS,JS和其他依赖的静态资产。这是您保存img,js,css,vendor,scss等文件夹的地方,包括任何* .css或* .js文件。

以下是静态文件夹的外观。

static
├── resume
    ├── css...
    ├── img...
    ├── js...
    ├── scss...
    └── vendor...  
    ├── gulpfile.js

以下可能是一些有用的代码更改:

#settings.py
...
STATIC_URL = '/static/'
...

对于index.html模板,

{% load static %}  <!-- skip {% load staticfiles %} as it is not needed  anymore -->

<!DOCTYPE html>
...
<!-- Bootstrap core CSS -->
<link href="{% static 'resume/vendor/bootstrap/css/bootstrap.min.css' %}" rel="stylesheet">
...
etc

href =“{%static ..%}”中的'static'指的是简历应用中的静态文件夹。为此,您可以通过添加上述资源的路径来附加要渲染的资源,以使用“bootstrap.min.css”。

我希望你的一些困惑得到澄清。从我收集的内容,您的views.py和urls.py文件配置正确。

以上是关于Django静态文件没有加载。修复settings.py以在相对路径上加载文件的主要内容,如果未能解决你的问题,请参考以下文章

Django 静态文件未加载且没有错误迹象

Django没有从静态目录加载样式文件

加载 Django runserver 提供的静态文件时如何修复 cors 错误

django 改了静态文件但是页面没有变

django开发环境setting.py里面设置debug=false时却成功加载静态文件?

Django加载静态文件