Как использовать блок 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 могут работать.

Другие вопросы по тегам