Макросы Jinja, получающие доступ к различным блокам

StackOverflow https://stackoverflow.com/questions/4247599

  •  27-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь заставить макрос 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? Это был бы самый простой способ сделать это, что я вижу. Это все равно зависит от вашего случая использования, но я думаю, что также будет «правильным способом».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top