2009-06-21 86 views
36

在Django的模板,这是常见的做到以下几点:在CSS Django的媒体文件的URL

<img src="{{ MEDIA_URL }}/img/someImage.jpg"> 

你将如何在不作为模板一个CSS文件做到这一点?

.someClass { 
    /* can't do this this */ 
    background: url("{{ MEDIA_URL }}/img/someImage.jpg");   
    /* either this */ 
    background: url("http://media.domain.com/img/someImage.jpg"); 
    /* or this */ 
    background: url("/django_static_media/img/someImage.jpg"); 
    /* can't do both... what to do? */ 
} 

我需要服务无论是从媒体的子域,或在脱机工作,我的文件,并直接为他们服务的Django的静态视图的能力。但CSS文件是一个问题,因为它们不作为模板处理,我不能使用MEDIA_URL上下文变量。

解决方案是什么?

编辑:我要指出,问题就出现了,因为我的静态媒体文件实际上位于一个单独的媒体子域名, 从而否定了使用相对路径。 明白了,谢谢!

回答

45

你的css文件来自哪里?这通常是不作为普通的媒体结构,如一个问题:

media/ 
    images/ 
    css/ 
    js/ 

(或类似)允许对图像的相对文件路径,例如:

background: url('../images/foo.png'); 

如果你没有准备好更改媒体文件夹结构,以适应相对文件路径,你可能没有办法,只好在模板中覆盖CSS声明,使用二次css文件脱机时:

{% if DEBUG %} 
    <link rel="stylesheet" href="{{ MEDIA_URL }}css/offline-mode.css" /> 
{% endif %} 

当然第一个选项更加整洁。

3

在你的CSS文件中使用相对路径(对于图像文件)不是你可行的选择吗?

0

如果您想在文件中使用模板指令,为什么不通过模板提供?

6

对不起,你不会喜欢答案。

我已经得到了同样的问题:

有没有简单的方法与静态停CSS文件来做到这一点。

我做什么:

  • 调试服务器,在本地工作,媒体在本地投放
  • 生产服务器托管了地方商业瓦特/媒体亚马逊S3
  • settings.py文件自动设置MEDIA_URL( DEBUG等),通过检查主机名(区分生产与本地的/ home /调试)
  • HTML文件都与 {{MEDIA_URL}}(+ RequestContext的 上下文的观点)
  • CSS链接
  • 我喜欢绝对路径名,所以一个“update_s3”脚本: (1)改变每个css文件暂时修复 'url(“/ media'to'url(”s3.mydomain。COM /媒体”和 (2)更新/上传我的/ media目录到Amazon S3

然后我去生产和做一个svn update &触摸WSGI文件&验证