在正确编译的 django 项目中找不到 screen.css compass/sass

Cannot find screen.css compass/sass in django project that is compiling correctly

我有一个 django 项目 compass init 用来在里面创建新的 compass 文件夹。当我在其中进行更改时,我的 compass/sass 正在编译,但我的模板没有进行任何这些更改或正常工作 - 在调试器中我收到 404 错误加载 'screen.css',但它发现 bootstrap 适当地。

在 base.htm 中,所有模板扩展:

{% block main_header %}
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Sitename</title>
        <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.4/css/bootstrap.css" rel="stylesheet">
        {% block custom_stylesheets %}{% endblock %}
        <link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css" />
</head>
{% endblock %}

在settings.py中:

INSTALLED_APPS = (
    ...
    'bootstrapform',
    'djcompass',
)

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

MEDIA_URL = '/media/'

STATIC_ROOT = os.path.join(BASE_DIR, 'static')

STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'staticfiles'),
)

SETTINGS_PATH = os.path.dirname(__file__)
PROJECT_PATH = os.path.join(SETTINGS_PATH, os.pardir)
PROJECT_PATH = os.path.abspath(PROJECT_PATH)

    os.path.realpath(os.path.dirname(__file__)) + '/templates/',
)

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

在screen.scss中:

@import "compass/reset";
@import "partials/weekly_schedule";

在_weekly_schedule.scss中:

@import 'compass/css3/box-shadow';
@import 'compass/css3/box-sizing';

.tabbed-content-box{
    border-radius: 6px;
    padding: 16px 5px 5px 5px;
}
...etc...

在相关模板中,weekly_schedule.htm:

{% extends 'base.htm' %}
{% load extras form_fields bootstrap %}

{% block body_block %}
    <form id="schedule_form" method="post" action="{% url 'owners:weekly_schedule' biz.slug %}"
            enctype="multipart/form-data">
        {% csrf_token %}

        {% for i in 7|get_range %}
            {% day_field day_dict i schedule_form %}
        {% endfor %}

<div style="clear;"></div>
<br/>

   <input type="submit" name="submit" value="Set schedule" />

    <button type="button" onclick="myFunction()">Try it</button>

{% endblock %}

过去,我的问题是导入 'compass/css3' 这毫无意义,因为我开始了一个指南针项目。此刻不再抱怨。我的 screen.css 似乎编译得很好,说

/* line 93, ../sass/partials/_weekly_schedule.scss */
.faketestthingy {
  background-color: red;
}

在我做了一个假条目之后。最重要的是,在项目根级别的 config.rb 中(compass init 放置它的地方)我有:

#http_path = "/home/myname/django_practice/scheduler_app"
http_path = "/"
css_dir = "stylesheets"
sass_dir = "sass"

其中两个http_paths我都试过了,都没有用。我不记得为什么我过去改变了我的 PROJECT_PATH (这是一个静态文件的东西)但我也尝试过没有绝对路径。我尝试将所有具有 "static/staticfiles" 的媒体设置更改为 "stylesheets",并且在 screen.css 上仍然是 404。非常感谢任何指针。谢谢

如果您想保持这种布局,您需要将 stylesheets 添加到 STATICFILES_DIRS:

1) 正在更新 STATICFILES_DIRS

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'staticfiles'),
    os.path.join(BASE_DIR, 'stylesheets'),
)

2) 正在更新 base.html

–加载staticfiles
– 使用 {% static %} 标签

嵌入样式表
{% load staticfiles %}
{% block main_header %}
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Sitename</title>
        <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.4/css/bootstrap.css" rel="stylesheet">
        {% block custom_stylesheets %}{% endblock %}
        <link href="{% static "screen.css" %}" media="screen, projection" rel="stylesheet" type="text/css" />
</head>
{% endblock %}

更新: 为什么之前没用

尤其是在开始时,需要花一些时间来感受 Django 所谓的静态文件和媒体文件与驱动应用程序的 Python/Django 代码的分离。

重要的一点是,从您的目录布局来看,您的网络服务器无法访问任何目录。这就是为什么如果我们想使用自定义目录布局,我们需要告诉 Django 我们放置静态资产的目录(css、javascript、图像、字体等)。我们通过添加 STATICFILES_DIRS 设置来做到这一点:

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'staticfiles'),
    os.path.join(BASE_DIR, 'stylesheets'),
)

现在 Django 知道在这两个目录中查找静态文件。这是第一步。

下一个重要的事情是 STATIC_URL 设置:

STATIC_URL = '/static/'

这告诉 Django 基础 URL 公开静态文件。假设我们有这些文件

/staticfiles/
    logo.jpg
    bg_tile.png
    js/
      app.js  
/stylesheets/
    styles.css
    styles_mobile.css

通过以上设置,Django 将在我们定义的命名空间下唯一地提供它们STATIC_URL,这意味着我们可以这样访问它们:

http://example.com/static/logo.jpg
http://example.com/static/bg_tile.png
http://example.com/static/js/app.js
http://example.com/static/styles.css
http://example.com/static/styles_mobile.css

长话短说,独立于它们的物理位置 Django 使它们可以通过唯一的 /static/ url.

访问

这就是 <link href="/stylesheets/style.css".../> 不起作用的原因。网络服务器(在开发时可能 runserver,在生产中类似于 nginx 或 apache)只是对 stylesheets 目录一无所知。

所以最后一步是使用 Django 的 static 模板标签来创建 link。这确保如果您更改 STATIC_URL 设置(例如从 /static//assets/),您不需要触摸任何模板,因为 {% static %} 正确解析它你.

一旦开始将您的应用程序部署到实时站点,它就会涉及更多(但不是那么多),但我希望这些信息足以帮助您入门。