Jinja2 模板与组件?块?模板?

Tos*_*kan 2 django jinja2

jinja2模板的一个小问题:我想创建一个可重用的模板来包含然后覆盖块。宏不允许我像参数一样轻松编写 HTML 垃圾吗?假设我想多次重用一个包含,并且在我想动态分配的块中使用大量的 HTML,我该怎么做?

我猜肯定不是宏,还是我错了?

{% render_foo('bar',2) %} 很好

{% render_foo('<table><tr><th>something</th><th>somethingelse</th></tr><tbody><tr>....etc') %} 不行了是吗

“你真的想做什么?”

是的,我告诉过你,我有一种方法可以为我的数据创建容器。容器总是相同的。每次使用的内容完全不同。一次一张桌子。曾经是一个引导组件。一旦形成。

周围的元素总是相同的

重现简单的错误这就是我所做的:

 {% include 'full_section.html' %}
  {% block fullsection %} <table><tr><th>something</th><th>somethingelse</th></tr><tbody><tr>....etc{% endblock %}

  {% include 'full_section.html' %}
  {% block fullsection %} <form>//some cool LONG big form </form>{% endblock %}
Run Code Online (Sandbox Code Playgroud)

full_section.html 内容只是为了完整性,实际上要复杂得多

<div class="my_cool_full_section">
{% block full_section %}{% endblock %}
</div>
Run Code Online (Sandbox Code Playgroud)

TemplateAssertionError: 块 'fullsection' 定义了两次

Tos*_*kan 5

我发现答案很好地隐藏在 jinja2 文档中

http://jinja.pocoo.org/docs/2.9/templates/#block-assignments

所以你使用一个宏和一个块分配,例如这样:

{% set section_content %}
<table><tr><td>etc</td> <td>etc</td> <td>etc</td></tr></table>
<table><tr><td>etc</td> <td>etc</td> <td>etc</td></tr></table>
<table><tr><td>etc</td> <td>etc</td> <td>etc</td></tr></table>
  {% endset %}
  {{  render_full_size_section(section_content)  }}


  {% set section_content %}
  aaaaaaaaaaa
    {% endset %}
    {{  render_full_size_section(section_content)  }}
Run Code Online (Sandbox Code Playgroud)

想知道他们在 2.8 之前在做什么......黑暗黑暗的中年

然后在宏中:

{% macro render_full_size_section(content) %}
<div class="mycoolsection">
  {{ content | safe }}
</div>
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)