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" />

あなたのテンプレートで。

前述のように、これは 1 つの色を変更するためだけに使用するべきではありません。それはあなたのテンプレートで行うことができます。このようなことをしなければならない場合は、ページが要求されるたびに動的に .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 の提案に従いました。ビューで必要な値を計算し、rawCSS 全体を含む非常に長い文字列 ( ) をテンプレートに渡します。テンプレートには、次のように含めます。

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

皆さんの努力に感謝します!

于 2012-06-11T17:06:30.763 に答える