Jinja宏访问不同的块

时间:2010-11-22 16:20:05

标签: python jinja2

我正在尝试将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 个答案:

答案 0 :(得分:4)

我不确定你是否有可能在Jinja做你所要求的。但我确实认为不同的方法可行,并提供更简单的解决方案:

而不是生成像

这样的标记
<div id='mytool'>
  This is my tooltip
</div>

和相应的jQuery调用,每个工具提示的ID都是硬编码的,如

<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宏写入两个独立的块。 / p>

答案 1 :(得分:1)

你能把它分成2个功能吗?比如,一个输出标记和一个输出javascript?这是我看到的最简单的方法。这一切都取决于你的用例,但我认为这也是“正确的方式”。