【问题标题】:Referencing image in CSS with relative path doesn't work in Django使用相对路径在 CSS 中引用图像在 Django 中不起作用
【发布时间】:2011-09-13 07:22:40
【问题描述】:

我正在使用带有内置静态应用程序的 Django 1.3。

我的静态文件夹结构是这样的:

static/
    css/
       main.css
       img/
    js/

所以我尝试从 CSS 中引用 static/css/img/ 文件夹下的图像,如下所示:

background:url('img/btn_white.gif') repeat-x;

但是图像没有显示出来。当我在 Chrome 中检查元素时,我发现图像路径是 http://localhost/mysite/static/css/main.css/img/btn_white.gif/

这很奇怪,因为这个相对路径应该引用 static/css/ 文件夹而不是 main.css。所以我尝试将路径更改为url('../img/btn_white.gif'),它适用于Chrome和Firefox,但不适用于IE。

我很确定这个问题与 Django 有关,因为在我的纯 HTML/CSS 中,这个相对路径工作得很好。我也尝试将css放在媒体文件夹中,问题是一样的。

我的静态应用相关设置:

在 settings.py 中:

STATIC_ROOT = os.path.join(os.path.dirname(__file__),'static').replace('\\','/')
STATIC_URL = 'http://localhost/mysite/static/'

在 urls.py 中:

(r'^static/(?P<path>.*)/$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}),

相关问题:Is a relative path in a CSS file relative to the CSS file?

【问题讨论】:

  • 在模板中包含您正在使用的&lt;link&gt; 标签。
  • @bradley.ayers
  • 嗯,我刚刚意识到您正在显示static/css/img 的结构。您意思是img低于css目录,还是并排?如果这是故意的,您可以尝试将其提升一级,那么url(../img/btn.gif) 语法将是正确的。
  • 就像布拉德利说的 - 如果一个答案解决了你的问题,你应该勾选它。
  • 对不起,我不知道。几天前已经标记了。

标签: django django-static


【解决方案1】:

问题是由您的 URLconf 引起的,特别是模式:

r'^static/(?P<path>.*)/$'

这意味着 URL 必须以正斜杠结尾才能匹配此模式。即以下 URL 将不匹配:(因为它没有尾部斜杠)

/mysite/static/css/main.css

奇怪的是,它确实有效。原因是 Django 的APPEND_SLASH 设置:

当设置为 True 时,如果请求 URL 不匹配 URLconf 中的任何模式并且它没有以斜杠结尾,则会向附加斜杠的相同 URL 发出 HTTP 重定向。请注意,重定向可能会导致在 POST 请求中提交的任何数据丢失。

所以当您的浏览器发出请求时:

/mysite/static/css/main.css

...Django 将无法将其与任何 URL 匹配,并将发出重定向到:(因为 APPEND_SLASH 默认为 True)

mysite/static/css/main.css/

这个新请求将成功,您的浏览器现在可以下载 CSS 文件,但是 CSS 文件的资源 URL 现在以斜杠结尾。当您的浏览器处理 CSS 规则并遇到:

background:url('img/btn_white.gif') repeat-x;

它将尝试将该相对 URI 连接到 CSS 资源的 URI。例如:

/mysite/static/css/main.css/ + img/btn_white.gif = /mysite/static/css/main.css/img/btn_white.gif

这将失败,因此您的浏览器将重定向到:(同样是因为APPEND_SLASH

/mysite/static/css/main.css/img/btn_white.gif/

但显然这也会失败。

解决方案

将您的 URL 模式更改为以下内容:(注意模式中删除的尾随 /

(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}),

或者使用recommended methods之一:

from django.conf import settings

if settings.DEBUG:
    urlpatterns += patterns('django.contrib.staticfiles.views',
        url(r'^static/(?P<path>.*)$', 'serve'),
    )

…或:

from django.contrib.staticfiles.urls import staticfiles_urlpatterns

# ... the rest of your URLconf here ...

urlpatterns += staticfiles_urlpatterns()

【讨论】:

  • 这是有道理的 - 我有更多的问题,什么时候应该或不应该有斜杠......
  • 希望我的文章能更清楚地说明发生了什么:)
  • 谢谢,这正是问题所在!我通过消除原始 url 设置中的斜线解决了这个问题。但是对于您给我的两种建议方法,第一种方法行不通。第二个在 Django 1.3 中有导入错误。
  • @Yifu 它在 Django 1.3 上对我来说很好,如果你想探索这个问题,请打开一个新问题。
  • 我花在削减 Django 上的时间比我想要的要多得多。很好的解释+1
猜你喜欢
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 2011-02-21
  • 2021-09-24
  • 1970-01-01
相关资源
最近更新 更多