これは SO に関する私の最初の質問であり、改善に関するヒントを喜んでお受けします。穏やかな :)
保守性を高めるために、CSS、JS、HTML をすべて同じファイルにまとめるようにしています。インクルード ファイルやマクロなどを使用すると、これが難しくなります。最終出力template.render()
では、CSS と JS をすべて取得し、ベース HTML テンプレートの上部と下部に配置する必要があります。
例は私が何を意味するかを説明する必要があります:
base.html
<html>
<head>
<style>
{{ print_css() }}
</style>
</head>
<body>
{% include 'bolded_text.html' %}
<script>
{{ print_js() }}
</script>
</body>
</html>
bolded_text.html
{# this doesn't need to be a filter. It could be a block, or anything else that would make this work #}
{% filter add_css %}
strong {
background: #ccc;
}
{% endfilter %}
<strong>Bolded text</strong>
{% filter add_js %}
alert('javascript included!');
{% endfilter %}
もちろん、出力は次のようになります。
<html>
<head>
<style>
strong {
background: #ccc;
}
</style>
</head>
<body>
{% include 'bolded_text.html' %}
<script>
alert('javascript included!')
</script>
</body>
</html>
予想どおり、問題は print_css() が何も出力しないことです。
コンテキスト フィルターを使用してこれを実行してみました。コンテキスト内の変数に whereadd_js
およびadd_css
append し、その変数print_css
をprint_js
出力します。print ステートメントはすべてのフィルターに従うため、これは JavaScript に対して適切かつ簡単に機能します。
ただし、CSS で動作させる方法が思い浮かびません。print_css()
呼び出しを遅延させるか、何らかの方法で jinja2 AST の出力を入れ替えることができれば、うまくいくかもしれません。私はハッキーな文字列操作 (CSS を下部に出力し、正規表現を使用して上部に移動するなど) を避けようとしています。
これをエレガントに行う方法があるかもしれないと考えましたが、jinja2 の低レベル API に関する私の経験は限られています。
どんな助けでも大歓迎です、ありがとう!