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

3
一个和 jinja2 模板有关的问题:
我想创建一个可重用的模板来包含并覆盖块。宏不让我像参数一样容易地编写 HTML 块,对吧?比如说我想多次重用一个 include,在其中使用大量的 HTML 块,并且我希望能够动态分配。
我该怎么做呢?
我猜肯定不是用宏,我错了吗? {% render_foo('bar',2) %} 是可以的。 {% render_foo('<table><tr><th>something</th><th>somethingelse</th></tr><tbody><tr>....etc') %} 不再是可行的了。
“你真正想要做什么?”
没错,就是我告诉过你的,我有一种为我的数据创建容器的方法。容器始终是相同的,但内容在每次使用时都是完全不同的。一次是表格,一次是 Bootstrap 组件,一次是表单。
周围的元素始终不变。
为了重现这个简单的错误,这是我所做的事情:
 {% 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 %}

full_section.html是为了完整性而存在的内容,实际上它要比这个简单得多。

<div class="my_cool_full_section">
{% block full_section %}{% endblock %}
</div>

模板断言错误:块 'fullsection' 定义两次。
1个回答

6

我在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)  }}

想知道在2.8版本之前他们在做什么...黑暗的中世纪

然后在宏中:

{% macro render_full_size_section(content) %}
<div class="mycoolsection">
  {{ content | safe }}
</div>
{% endmacro %}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接