将HTML传递给Jinja宏

时间:2016-08-30 08:47:58

标签: html jinja2

我的页面有很多Bootstrap模式,它们总是有相同的标记,当然除了标识符和实际内容。

为了最大限度地减少这些模式的巨大和重复数量的代码,我想构建一个Jinja宏,它通过一个简单的调用为一个模态吐出整个HTML标记,例如:

{# macros/modal_template.jinja2 #}

{% macro print_modal(id, title, body_content) %}
  <div class="modal fade" id="{{ id }}" tabindex="-1">
    <div class="modal-dialog">
       <div class="modal-content">
        <div class="modal-header">
          <button type="button" class="close" data-dismiss="modal"><span>&times;</span></button>
          <h4 class="modal-title">{{ title }}</h4>
        </div>
        <div class="modal-body">
          {{ body_content }}
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
          <button type="button" class="btn btn-primary">Save changes</button>
        </div>
      </div>
    </div>
  </div>
{% endmacro %}


{# my_page.jinja2 #}

{% from "macros/modal_template.jinja2" import print_modal %}
<html>
<body>
  {{ print_modal("description-modal", "Description", "Lorem Ipsum") }}
</body>
</html>

到目前为止,它几乎是不费脑子的,但是图片body_content不是一个简单的字符串,而是一个复杂的HTML表单或一个带有文本样式HTML的真正长文本。我很难找到解决这个问题的好办法。

到目前为止,我提出的唯一可行解决方案是将内容作为字符串传递并使用{{ body_content|safe }}进行打印,但将复杂的标记放入字符串中会很难看并且不舒服。

你们有什么好主意吗?

1 个答案:

答案 0 :(得分:4)

稍微延迟回答 - 我刚刚看到你的问题在谷歌搜索同样的事情,但我想出来了:

你能做的就是利用jinjas call / caller()功能......

{% macro print_modal(id, title) %}
  <div class="modal fade" id="{{ id }}" tabindex="-1">
    <div class="modal-dialog">
       <div class="modal-content">
        <div class="modal-header">
          <button type="button" class="close" data-dismiss="modal"><span>&times;</span></button>
          <h4 class="modal-title">{{ title }}</h4>
        </div>
        <div class="modal-body">
          {{ caller() }} <---- {# Look at me! #}
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
          <button type="button" class="btn btn-primary">Save changes</button>
        </div>
      </div>
    </div>
  </div>
{% endmacro %}

当你使用宏

{% call print_modal(someId, someTitle) %}
    {# whatever you put in here will be placed into the {{caller()}} line #}
    {# for example #}
    <h1>HELLO WORLD</h1> {# Will format an h1 into the caller block #}
{% endcall %}