【问题标题】:Django 2.1: Base template for all apps does not recognize static files in project rootDjango 2.1:所有应用程序的基本模板无法识别项目根目录中的静态文件
【发布时间】:2019-03-18 19:57:07
【问题描述】:

遵循此结构:

gallito (Django project folder)
   |_gallito
   |_main_app
             |_static
                     |_main_app
                               |_style.css

   |_static
            |_style2.css
   |_templates (new)
                |_registration
                              |_login.html
                |_base.html

我需要/想要在项目根模板文件夹中有一个基本模板,该模板扩展到我的 main_app 内的 html 文件(以及将来会有的其他应用程序)。

'base.html' 扩展了 correclty,但在读取项目根目录中 static 文件夹中的 css 文件时出现问题:'style2.css'

在项目根目录静态模板文件夹内的 base.html 文件中,我有:

使用它并从 main_app 调用样式表,我的网站可以正常工作:

<link href="{% static 'main_app/style.css' %}" rel="stylesheet">

但是如果我想从项目根静态文件夹中调用样式表,它就不起作用了:

<link href="{% static 'style2.css' %}" rel="stylesheet">

为什么?

我的项目设置中有这个:

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/

STATIC_URL = '/static/'

我读到我还需要一个 STATICFILES_DIRS 变量来指向我的静态文件目录。有这方面的指针吗?

STATICFILES_DIRS

来自根目录的base.html:

{% load staticfiles %}


<!doctype html>
<html lang="en">
<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="">
    <link rel="icon" href="../../../../favicon.ico">

    <title>Jumbotron Template for Bootstrap</title>

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

    <!-- Custom styles for this template -->
    <link href="jumbotron.css" rel="stylesheet">
    <!-- Custom styles for this template -->
    <link href="signin.css" rel="stylesheet">


    <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet">
    <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" rel="stylesheet">
    <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.bundle.min.js" rel="stylesheet">

    <link href="https://use.fontawesome.com/releases/v5.3.1/css/all.css" rel="stylesheet"/>


   <link href="{% static 'main_app/style.css' %}" rel="stylesheet">
    <!--<link href="{% static 'style2.css' %}" rel="stylesheet">-->



</head>

【问题讨论】:

  • @Hildy 没有解决问题。
  • 是的,我看错了,答案来了……

标签: django


【解决方案1】:

根据 cmets 中的对话,我将补充一点,使用您当前的项目结构,您可以将 &lt;link href="{% static 'style2.css' %}" rel="stylesheet"&gt; 更改为 &lt;link href="{% static '../static/style2.css' %}" rel="stylesheet"&gt;,因为您在根级别引用静态文件,而 Django 正在查看每个应用程序默认为静态文件。但是,我希望你会考虑以下几点:

如果您要使用多个静态文件位置,使用collectstatic 方法可能会很方便。您需要做几件事。

首先,您需要像这样创建静态文件所在位置的列表 - 要了解,当您运行稍后描述的 collectstatic 命令时,Django 将默认搜索每个项目中的 static/ 文件夹,所以这些位置适用于每个应用程序根目录下未命名为 static/ 的任何目录:

STATICFILES_DIRS = [os.path.join(BASE_DIR, 'one/static_location'),
                    os.path.join(BASE_DIR, 'some_other/static_location')]

您最终将运行一个命令,将您的静态文件收集到一个位置。这称为静态文件根目录。一旦你决定了放置它的合理位置,你就可以在你的 settings.py 中创建一个变量,像这样注册:

STATIC_ROOT = os.path.join(BASE_DIR, "the_location_you_chose/")

然后,运行命令python manage.py collectstatic。 您现在可以在模板中引用STATIC_ROOT 的路径;请记住,您可能需要上一两个目录,具体取决于所述模板在您的项目结构中的位置。

无论如何,这是一种方法。但请记住,正如文档所述,让 Django 提供静态文件并不是一个好习惯。

这个 SO answer 也可能值得一读。

还要意识到每次更改静态文件或添加新文件时都需要运行collectstatic 命令,因为静态根目录仍会包含旧文件。

【讨论】:

  • 泰。你可以使用我的应用程序的名称而不仅仅是one/static_locationsome_other/static_location吗? 2) 每次更改文件或添加新文件时,我是否应该在runserver 之前运行python manage.py collectstatic? 3) 我不明白如何引用STATIC_ROOT 的路径。你能用我的模板base.html来解释一下吗,请-
  • 好吧,你可以自己做一些简单的事情,只需将每个应用程序中包含静态文件的目录命名为static,你可能根本不需要STATICFILES_DIRS,因为Django已经知道在那里查看.因此,如果您的应用程序被称为“AppOne”,并且具有像 myProject&gt;AppOne&gt;static 这样的目录,则意味着 Django 并且 collectstatic 命令只会找到它们。然后你要做的是创建每个静态目录,如AppOne&gt;static&gt;AppOne&gt;css&gt;custom_styles.css。然后将它与 {{% static 'AppOne/css/custom_styles.css' %}} 一起使用
  • 但是如果我正确理解了您的图表,部分问题可能是您在根级别有一个名为 static 的目录,而 Django 并没有在那里寻找静态目录,它正在寻找在应用程序内。你可以试试这个来证明对错:把&lt;link href="{% static 'style2.css' %}" rel="stylesheet"&gt;改成&lt;link href="{% static '../static/style2.css' %}" rel="stylesheet"&gt;
  • 这正是我认为的问题所在。您提出的最后一个解决方案并没有解决它。泰。
  • 酷。如果是我,我会使用根级别的静态目录作为我的静态根目录,并将style2.css 放在其中一个应用程序collectstatic 的静态目录中,然后在每个模板中引用它。
猜你喜欢
  • 2018-03-13
  • 2015-08-28
  • 2011-09-18
  • 1970-01-01
  • 2013-01-23
  • 2015-06-12
  • 1970-01-01
  • 2021-11-20
  • 2016-10-23
相关资源
最近更新 更多