Как использовать блок JavaScript Sekizai в шаблонном фильтре Django?
Я пишу шаблонный фильтр 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>
Это отлично работает.
Тем не менее, с Sekizai, я хочу <script>...</script>
в mytemplate.html
быть добавленным в блок "js":
{% 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 в свой шаблонный фильтр и сделать так, чтобы он отображался в шаблоне страницы?
Спасибо!
1 ответ
Фильтры шаблонов Django не наследуют глобальный контекст шаблона, но теги включения могут (если вы установите takes_context=True
в inclusion_tag
декоратор).
Я бы посоветовал вам реорганизовать код для использования тега включения вместо фильтра, и в этом случае блоки sekizai могут работать.