Макросы Jinja для доступа к различным блокам - PullRequest
3 голосов
/ 22 ноября 2010

Я пытаюсь получить макрос 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 и потребует написания расширения?

Спасибо

Ответы [ 2 ]

4 голосов
/ 22 ноября 2010

Я не уверен, возможно ли сделать то, что вы просите в Джинджа.Но я думаю, что другой подход мог бы работать и обеспечить более простое решение:

Вместо генерации разметки, такой как

<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.

1 голос
/ 08 августа 2012

Не могли бы вы разделить его на 2 функции? Например, тот, который выводит разметку, и тот, который выводит javascript? Это был бы самый простой способ сделать это, что я вижу. Все зависит от вашего варианта использования, но я думаю, что это также будет «правильный путь».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...