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 ブロックに追加して、ページ テンプレートにレンダリングすることはできますか?
ありがとう!