Макросы Jinja, получающие доступ к различным блокам
Вопрос
Я пытаюсь заставить макрос Jinja2 выводиться в другую часть вызывающего шаблона.Причина, по которой я хочу это сделать, заключается в том, что в макросе есть встроенный Javascript, но я хочу, чтобы весь Javascript был в конце шаблона.Я в принципе хочу сделать что-то вроде этого
{% import 'tooltip.html' as tooltip %}
<html>
<body>
{% block contents %}
{% tooltip('mytool') %}
{% endblock %}
<script>
{% block javascript %}
{% endblock %}
</script>
</body>
</html>
И в файле макроса
{% macro tooltip(name) %}
<div id='{{ name }}'>
This is my tooltip
</div>
{% block javascript %}
jQuery("#{{ name }}").click(function(){//do something});
{% endblock %}
{% endmacro %}
Таким образом, конечный результат был бы чем-то вроде
<html>
<body>
<div id='mytool'>
This is my tooltip
</div>
<script>
jQuery("#mytool").click(function(){//do something});
</script>
</body>
</html>
Я хочу, чтобы весь мой javascript был в конце моего шаблона, но макросы, похоже, просто возвращаются тогда и там.
Есть ли что-то, чего мне не хватает, или это выходит за рамки стандартного Jinja2 и потребует написания расширения?
Спасибо
Решение
Я не уверен, возможно ли сделать то, о чем вы просите, в Jinja.Но я действительно думаю, что другой подход мог бы сработать и обеспечить более простое решение:
Вместо генерации разметки типа
<div id='mytool'>
This is my tooltip
</div>
и соответствующий вызов jQuery с жестко заданным идентификатором каждой всплывающей подсказки, например
<script>
jQuery("#mytool").click(function(){});
</script>
для каждой всплывающей подсказки на странице присвойте каждой всплывающей подсказке class
атрибут и заставить функциональность jQuery работать со всеми элементами с помощью этого class
.Таким образом, каждая страница может иметь один и тот же общий бит jQuery и работать независимо от того, какие всплывающие подсказки появляются на этой конкретной странице.
Что-то более похожее:
<div id="mytool" class="tooltip">
This is my tooltip
</div>
плюс более общий вызов jQuery:
<script>
// This will add the onclick handler to any element
// with a class of "tooltip"
jQuery(".tooltip").click(function(){});
</script>
Этот код jQuery может быть включен один раз, в нижней части вашего "базового" шаблона, чтобы он был доступен на каждой странице и вам не нужно было выяснять, как выполнить запись в два отдельных блока из макроса Jinja.
Другие советы
Не могли бы вы разделить его на 2 функции? Как, тот, который выводит разметку и тот, который выводит JavaScript? Это был бы самый простой способ сделать это, что я вижу. Это все равно зависит от вашего случая использования, но я думаю, что также будет «правильным способом».