3

Django テンプレート フィルターを作成しています。JavaScriptを挿入したいと思います。簡単に言うと、このフィルターで Sekizai の「js」ブロックに追加する方法はありますが、ページ テンプレートで定義された「js」ブロックでレンダリングする方法はありますか?

私の質問をより明確にするために、次のフィルターは私が望むことを行いますが、Sekizai は使用しません: (簡単にするために自動エスケープを省略します)

from django import template
from django.template import Context
register = template.Library()
@register.filter  
def myfilter(text):
    context = { "text": text }
    myhtml = get_template('mytemplate.html')
    return myhtml.render(Context(context))

そこにmytemplate.htmlはJavaScriptが含まれています。

<canvas id="xyz" width="200" height="200"></canvas>
<script>
function drawCircle(context, radius, centerX, centerY, color) {
    context.beginPath();
    context.arc(centerX, centerY, radius, 0, 2 * Math.PI);
    context.fillStyle = color;
    context.fill();
}
var canvas = document.getElementById('xyz');
var context = canvas.getContext('2d');
drawCircle(context,50,100,100,"blue");
</script>

これはうまくいきます。

ただし、セキザイでは、「js」ブロックに<script>...</script>inを追加したい:mytemplate.html

{% addtoblock "js" %}<script>...</script>{% endaddtoblock %}

(Sekizai を使用するには、フィルターの変更も必要です。

from sekizai.context import SekizaiContext
...
    return myhtml.render(SekizaiContext(context))

)

しかし、テンプレート フィルターには「js」ブロックがないため、これは機能しません。そのため、JavaScript はレンダリングされません。ただし、全体像には「js」ブロックがあります。たとえば、フィルタは次のようなテンプレートから呼び出されています。

{% load sekizai_tags %}
<head>...</head>
<body>
     {{ info|myfilter }}
     {% render_block "js" %}
</body>

それで...この問題を回避する方法はありますか?テンプレート フィルターで Sekizai ブロックに追加して、ページ テンプレートにレンダリングすることはできますか?

ありがとう!

4

1 に答える 1

1

Django テンプレート フィルターはグローバル テンプレート コンテキストを継承しませんが、包含タグは継承できます (デコレーターで設定takes_context=Trueした場合)。inclusion_tag

フィルターの代わりに包含タグを使用するようにコードをリファクタリングすることをお勧めします。その場合、sekizai ブロック機能する可能性があります。

于 2013-02-19T08:52:01.817 に答える