如何在我的css文件中引用静态文件?

the*_*row 37 django django-static

我的CSS文件中有一个引用静态图像的引用:

#logo
{
  background: url('/static/logo.png')
}
Run Code Online (Sandbox Code Playgroud)

这在我的开发机器上运行得很好,但在我的生产环境中没有,因为url应该是static.mydomain.com/logo.png.如何根据设置文件中的STATIC_URL动态更改css文件?

Ric*_*lli 34

使用相对路径.相对于css文件所在的文件夹

  • 这不是解决方案.如果我决定将我的静态URL更改为`/ my/super/static/files /? (17认同)
  • 这个答案没有解决这个问题.如果静态资产托管在其他站点上,则相对路径将不起作用. (6认同)
  • 但 CSS 和文件可能位于与请求来源不同的服务器上。这仍然有效吗?该路径是相对于css文件的路径吗? (2认同)
  • 例如,你有 `http://static.mydomain.com/images/logo.png` 和 `http://static.mydomain.com/css/style.css`。然后你可以使用`background: url('../images/logo.png')` (2认同)
  • 搜索+取代?任何项目都可能发生这种情况,但很少为此生成CSS,JS等.您应该有充分的理由将静态资源设置为静态资源,否则,利用已经可用的工具(如*nix框上的sed,awk等)或大多数优秀IDE所具有的"跨文件搜索和替换"选项. (2认同)

Nex*_*xus 13

您可以将包含静态文件路径的任何CSS移动到模板中包含的内联CSS.

<div style="background: url('{% static 'logo.png' %}')"></div>
Run Code Online (Sandbox Code Playgroud)

这里的问题是它不适用于@media查询,你需要将它们放在一个块中,例如

<style>
    @media (min-width: 1200px){
       background: url('{% static 'logo.png' %}');
    }
</style>
Run Code Online (Sandbox Code Playgroud)

  • 抱歉,没有。企业部署和我们这些编写有效HTML的人员都不允许这样做。错误的HTML / CSS。 (5认同)
  • 我同意,但那不是重点.没有人认为在整个项目中普遍使用样式标签作为设计模式是一个好主意,那是你在那里攻击的稻草人.这是一个边缘情况,不使用样式标记意味着你必须硬编码静态资产URI,我认为这是更大的邪恶.如果它不适合你的项目那么好,但它仍然是一个完全有效的解决方案. (5认同)
  • 内联 &lt;style&gt; 标签是完全有效的 HTML,validator.w3.org 对它们没有问题。请不要传播FUD。 (2认同)
  • 没有FUD。由于优先顺序,内联样式和样式标签是不好的魔力。如果您在一个大型项目/生产中并且正在编译 CSS,那么内联操作可能会消耗时间并中断执行。看过很多次了。验证器不吠并不意味着好主意。内联征求!重要的滑坡。此外,内联元素 + DOM 操作会导致相当大的问题。我过去 10 年参与的任何项目都不允许这种做法。保持 CSS 独立,避免草率、懒惰和愚蠢。此外,现代 MVC FE 几乎没有 HTML。#反模式 (2认同)

小智 12

如果你想{% static %}在你的 CSS 文件中使用标签,你应该使用 {% include %} 标签。这是一个这样做的例子:

foo.html

{% load static %}
{% load i18n %}
{% load widget_tweaks %}

<!DOCTYPE html>
<html>
<head>
    <style>
        {% include "path/to/custom_styles_1.css" %}
    </style>
    <link rel="stylesheet" href="{% static 'css/custom_styles_2.css' %}">
</head>
<body>
<!-- Your HTML body -->
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

custom_styles_1.css

{% load static%}

{
     background: url('{% static "/img/logo.png" %}')
}
Run Code Online (Sandbox Code Playgroud)

custom_styles_2.css

.fa {
    position: relative;
    text-align: center;
    font-family: BTitrBold;
    font-size: 3.5em;
}

.name {
    position: absolute;
    top: 37%;
    right: 15%;
}

.school {
    position: absolute;
    top: 530px;
    right: 200px;
}

.id {
    position: absolute;
    top: 700px;
    right: 200px;
}

.degree {
    position: absolute;
    top: 740px;
    left: 195px;
}
Run Code Online (Sandbox Code Playgroud)

custom_styles_1.css是包含{% static %}标签的 CSS 文件。您应该将它与带有{% include %}标记的 foo.html 文件集成。这样,Django 就会把你需要的所有样式放在合适的地方,并正确渲染静态标签。

custom_styles_2.css是一个位于STATIC_ROOT目录中的普通 CSS 文件,因此您可以{% static %}毫无问题地使用标签。


小智 12

使用基本目录中的绝对 URL,这将指向应用程序内静态文件夹中的任何文件

设置.py:

STATIC_URL = '/static/'
Run Code Online (Sandbox Code Playgroud)

样式.css:

background-image: url('/static/img/sample.jpg');
Run Code Online (Sandbox Code Playgroud)

  • 两年后仍挽救生命,谢谢! (2认同)

Chr*_*att 5

看到这个类似的stackoverflow问题

进行所需操作的唯一方法是通过Django生成CSS。HTML通常与Django视图和模板相关联,但实际上,您可以返回任何文件类型:CSS,JavaScript,纯文本等。但是,这样做会增加网站的开销,因此请设置适当的HTTP标头和服务器端缓存生成的文件将非常重要。

基本方法:

return render_to_response('stylesheet.css',
    { 'domain': 'http://static.mydomain.com/' },
    context_instance=RequestContext(request),
    mimetype='text/css'
)
Run Code Online (Sandbox Code Playgroud)

或者,您可以在系统上设置主机,以将静态域映射回localhost以进行开发。然后,您可以正常引用该域,但仍会从您的开发文件中提取该域。另外,如果您碰巧在系统上安装了Ruby,则可以使用称为Ghost的rubygem。它使您可以直接从命令行轻松地创建,启用,禁用和删除自定义主机,而不必大惊小怪。