如何让静态文件在我的 Django 项目中工作?

How can I get static files to work in my Django project?

使用:Python 3.7 和 Django 2.1.4

我正在学习 William S. Vincent 的 Django for Beginners 书中的教程。我在本书的“博客应用程序”部分,我一直在按照他的指示进行操作。但是,无论我做什么,我似乎都无法让开发服务器为我的静态 CSS 文件提供服务。

My source code can be found here.

我正在使用 manage.py runserver 到 运行 用于本地测试的开发演示服务器。

这是我的目录树:

./
├── blog
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── blog_project
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── db.sqlite3
├── manage.py
├── Pipfile
├── Pipfile.lock
├── static
│   └── css
│       └── base.css
└── templates
    ├── base.html
    └── home.html

最初我用这一行更新了我的blog_project/settings.py

STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

然后我将 {% load static %} 放在 templates/base.html 文件的顶部,并在 <head> ... </head> 部分添加 <link href="{% static 'css/base.css' %}" rel="stylesheet">

写入 static/css/base.css 文件后,这应该有效。但它没有。我研究了论坛和 Stack Overflow,看到有人建议将静态目录添加到 blog_project/settings.py 文件中,因此我更新了该文件,将以下内容添加到底部:

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

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATICTILES_DIRS = [
    STATIC_ROOT,
]

然后我更新了 blog_project/urls.py 文件,添加了两个新的导入:

from django.conf.urls.static import static
from django.conf import settings

和以下行:

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

但即使这样也行不通。

您可以查看我的 settings.py, urls.py and base.html 文件以了解我在说什么。

我希望 manage.py runserver 托管静态文件,但它没有。当我尝试直接加载 CSS 文件时,出现 404 错误。

首先,您在链接的 settings.py 文件中将 STATICFILES_DIRS 拼写错误,拼写错误的是 T 而不是 F:STATICTILES_DIRS.

其次,不要将 STATIC_ROOT 放在 STATICFILES_DIRS 中的任何位置。来自文档:

Warning

This (STATIC_ROOT) should be an initially empty destination directory for collecting your static files from their permanent locations into one directory for ease of deployment; it is not a place to store your static files permanently. You should do that (by that they mean 'store your static files') in directories that will be found by staticfiles’s finders, which by default, are 'static/' app sub-directories and any directories you include in STATICFILES_DIRS).

注:草书是我加的


所以我为您推荐以下配置 setttings.py:

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

只要您处于调试模式,DEBUG=True,您就可以开始了。也不需要像在 urls.py 中那样将 STATIC_ROOT 添加到 urlpatterns。如果您的 INSTALLED_APPS 中没有 django.contrib.staticfiles(请参阅 here),您只想这样做。

此刻你想切换到生产,看看how this is done correctly

希望对您有所帮助,编码愉快!