如何使动态CSS模板?(How to render a template with dynamic

2019-09-17 23:33发布

我想创建一个视图动态的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文件(正如我在回答类似的问题已经找到),因为会有几百可能性。

Answer 1:

如果你绝对需要你可以创建一个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文件的视图。



Answer 2:

views.py:

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

模板:

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

不要动态创建CSS文件,它是不必要的。



Answer 3:

我去@ CatPlusPlus的建议:在一个视图计算所需的值,并通过模板中的很长的字符串( raw ),它包含了整个CSS。 在模板中,我包括它像这样:

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

感谢大家的努力!



文章来源: How to render a template with dynamic CSS?