Django 2.1:所有应用程序的基本模板无法识别项目根目录中的静态文件

时间:2018-10-14 02:19:53

标签: django

遵循以下结构:

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'扩展了相关性,但是在项目根目录“ style2.css”的静态文件夹中读取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>

1 个答案:

答案 0 :(得分:2)

根据评论中的对话,我将添加您当前的项目结构,您可以将此<link href="{% static 'style2.css' %}" rel="stylesheet">更改为此<link href="{% static '../static/style2.css' %}" rel="stylesheet">,因为您是在根级别引用静态文件,而Django是默认情况下,在每个应用程序中查找静态文件。但是,希望您考虑以下内容:

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

首先,您需要创建一个静态文件所在的位置列表,如下所示-了解默认情况下,当您运行上述static/命令时,Django将在每个项目中搜索collectstatic文件夹以后,这些位置适用于每个应用程序根目录下未命名为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命令,因为静态根目录仍将包含旧文件。