7

我想在视图中创建一个动态 CSS 文件,然后渲染一个加载该 CSS 文件的模板。根据赋予视图的参数,每次调用视图时,CSS 可能在某些位置具有不同的值。我该怎么做呢?(我应该补充一点,我没有用 Python/Django 编写文件的经验。)

这是我认为它应该如何工作的简化示例:

# urls.py
urlpatterns = patterns('',
    (r'^myview/(?P<color>[0-9a-f]{6})/$', create_css_file),
)

# views.py
def create_css_file(request, color):
    raw = "@charset 'UTF-8';\n\n"
    raw += "body {\n"
    raw += "  color: #" + color + ";\n"
    raw += "}\n\n"

    f = open('mydynamic.css', 'r+')
    f.write(raw)

    return render_to_response('mytemplate.html', locals())

# mytemplate.html
{% extends "base.html" %}
{% block head %}
    <link rel="stylesheet" media="screen" href="{{ f.name }}" />
{% endblock %}

出于某种原因,这不起作用,尽管在生成的 HTML 页面的源代码中,看起来 CSS 文件已正确加载。f偶数正确到达模板,因为当我将行更改为时我可以看到它的<link>...内容

<link rel="stylesheet" media="screen" href="{{ f }}" />

f而不是f.name)。但是 HTML 是在没有所需颜色设置的情况下呈现的。谁能告诉我这是为什么?

我怀疑一些路径问题,我玩弄了很多不同的路径,但无济于事。

请不要建议我准备几个硬编码的 CSS 文件(正如我在类似问题的答案中发现的那样),因为会有数百种可能性。

4

3 回答 3

12

如果您绝对需要,您可以动态创建一个 css 文件。

您可以在 urls.py 中创建一个条目。您可以将 url 命名为任何您想要的名称,这对于外界来说可能看起来像一个静态的 .css 文件,但会动态创建。

(r'^(?P<color>[0-9a-f]{6})/dynamic.css$', dynamic_css)


def dynamic_css(request, color):
   """
   Create a css file based on a color criteria,
   or any other complicated calculations necessary
   """
   # do custom element positionting.
   return render_to_response('dynamic.css', {'color': color})


# dynamic.css    
body {
  background-color: {{ color }}
}

没有理由为此编写 css 文件。现在你可以只包括

<link rel="styleshee" type="text/css" href="/purple/dymamic.css" />

在您的模板中。

如前所述,这不应仅用于更改一种颜色。这可以在您的模板中完成。如果您必须做这样的事情,那么实现缓存可能是一个好主意,因为每次请求页面时它都必须动态生成可能是性能开销的 .css。这更像是一个示例,表明您可以根据需要命名 urls.py 条目。并以您想要的任何方式将它们包含在 html 中,即。如果您需要动态创建的自定义 javascript 文件,您可以在 urls.py 中创建一个条目,然后创建一个生成 .js 文件的视图。

于 2012-06-10T15:43:16.007 回答
3

视图.py:

def create_css_file(request, color):
    f = color
    return render_to_response('mytemplate.html', locals())

模板:

<body style = "color:{{f}}!important;">

不要动态创建 css 文件,这是不必要的。

于 2012-06-10T11:39:19.687 回答
2

我接受了@CatPlusPlus 的建议:在视图中计算必要的值并向模板传递一个raw包含整个 CSS 的非常长的字符串 ( )。在模板中,我像这样包含它:

<style media="screen">{{ raw|safe }}</style>

感谢大家的努力!

于 2012-06-11T17:06:30.763 回答