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' 定义了两次
我发现答案很好地隐藏在 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)