【问题标题】:Trouble accessing .css file with Django使用 Django 访问 .css 文件时遇到问题
【发布时间】:2013-03-20 08:33:02
【问题描述】:

我刚开始使用 Django,在 AptanaStudio3 中使用 PyDev。我使用有用的 Django 教程来构建我的简单项目的主干。现在我正在尝试使用 css 进行一些基本的格式化和着色,但已经花了很长时间挣扎。

html 页面仍然显示正常。它只是没有抓住css(404)。我从控制台知道这一点:

[20/Mar/2013 12:41:51] "GET /signup/ HTTP/1.1" 200 306
[20/Mar/2013 12:41:51] "GET /signup/static/signup.css HTTP/1.1" 404 2750

我的文件结构:

Learning
- Learning
--- templates
----- 404.html
----- 500.html
--- _init.py
--- settings.py
--- urls.py
--- wsgi.py
- signup
--- static
----- signup.css
--- templates
----- signup
------- detail.html
------- index.html
------- results.html
----- __init__.py
----- admin.py
----- models.py
----- tests.py
----- urls.py
----- view.py
--- manage.py
--- sqlite.db
--- python

在设置中:

STATIC_ROOT = ''
STATIC_URL = 'static/'
STATICFILES_DIRS = ('')
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

在我的 html 模板中:

<html>
    <head>
        <title>User List</title>
        <link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}signup.css" />
...

在views.py中:

def ip_address_processor(request):
    return {'ip_address': request.META['REMOTE_ADDR']}
def index(request):
    user_list = User.objects.order_by('name')[:5]
    template = loader.get_template('signup/index.html')
    context = RequestContext(
                             request,
                             {'user_list': user_list,},
                             [ip_address_processor])
    return HttpResponse(template.render(context))

有什么见解吗?

【问题讨论】:

  • 你运行./manage.py collectstatic了吗? Django 需要将所有静态文件收集到一个目录中,以便使用测试服务器为它们提供服务。另外,请务必将您的STATIC_ROOT 设置设置为绝对且可写的路径,以便可以有效地收集文件。有关详细信息,请参阅Django documentation on static files。另外,请记住,在生产环境中,静态文件应直接由 HTTP 服务器提供。
  • 此外,您的 CSS 文件在路径 /signup/static/signup.css 处检索,而您的 STATIC_URL 是 /static/。 您需要将该路径设为绝对路径,而不是相对于您的页面。 更改为href="/{{ STATIC_URL }}signup.css",或使用staticfiles 库提供的{% static 'signup.css' %} 模板标签(更好 !)。
  • @pistache (post1),不,我没有运行它。我只是按照你的建议做了,没有解决。我马上更新文件结构。
  • @pistache (post2) 太棒了! STATIC_URL 路径是问题所在。我做到了绝对,奇迹发生了。非常感谢! (另外,如果您将该评论作为正式答案,我会很乐意接受)
  • @pistache 不正确,collectstatic 仅用于部署,不用于开发。

标签: css django static


【解决方案1】:
  • 您的STATIC_URL 是一个相对路径(static/),这意味着所有静态文件都将相对于当前页面进行搜索。 Django 的测试服务器不期望这种行为,因此不会匹配静态 URL,从而触发 404 错误。您需要将该路径设为绝对路径,而不是相对于您的页面(例如,/static/)

  • 当使用 Django 的静态文件系统和测试服务器时,你需要使用 ./manage.py collectstatic 来收集你的静态文件

  • 我也强烈推荐使用 {% static 'signup.css' %} 语法而不是 {{ STATIC_URL }}signup.css 。 请注意,如果您使用这种替代格式,则需要在文件中包含{% load static %}某个位置。

【讨论】:

  • 这对我来说有点夸张。 Django 文档推荐使用 staticfiles 模块,在我看来,这是标准的做法,你应该这样做。当然结果是一样的,但我喜欢约定俗成和清晰。
  • 顺便说一句,您的编辑是一个非常好的主意(尤其是因为缺少{% load staticfiles %} 导致的错误根本不明确)。我还没来得及接受它就被其他用户拒绝了,这表明 有多少 SO 用户正在查看编辑而不看。我会自己添加,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
  • 2022-07-08
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多