我想创建一个视图动态的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文件(正如我在回答类似的问题已经找到),因为会有几百可能性。
如果你绝对需要你可以创建一个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" />
在您的模板。
如前所述这不应该只是改变一个颜色使用。 这可能在你的模板来完成。 如果你不得不做这样的事情,很可能会实现cacheing为每一个页面被请求具有动态生成的CSS这可能是性能开销时间是个好主意。 这更是一个例子,以显示你能说出你想要urls.py条目东西。 并包含在你的HTML即希望的任何方式。 如果你需要的JavaScript文件动态创建一个自定义的,你可以创建urls.py一个条目,然后创建生成.js文件的视图。
views.py:
def create_css_file(request, color):
f = color
return render_to_response('mytemplate.html', locals())
模板:
<body style = "color:{{f}}!important;">
不要动态创建CSS文件,它是不必要的。
我去@ CatPlusPlus的建议:在一个视图计算所需的值,并通过模板中的很长的字符串( raw
),它包含了整个CSS。 在模板中,我包括它像这样:
<style media="screen">{{ raw|safe }}</style>
感谢大家的努力!