1

假设我们有以下结构

模板/modal.html

<div class="title">
   {% block title %}
   {% endblock %}
</div>
<div class="content">
   {% block content %}
   {% endblock %}
</div>

模板/usermodal.html

{% extends "modal.html" %}
{% block title %}
     Hello {{ user }}
{% endblock %}
{% block content %}
     Some content
     {% include "table.html" %}
{% endblock %}

模板/table.html

<table>
   <tr>
      <td>
         {{ data }}
      </td>
   </tr>
</table>

我想将以下内容返回到客户端,以使用 js/客户端模板填充它

<div class="title">
     Hello {{ user }}
</div>
<div class="content">
     Some content
    <table>
      <tr>
        <td>
          {{ data }}
       </td>
      </tr>
    </table>
</div>

所以基本上我正在寻找的是一种类似于flask中的render_template的方法,但它只组装模板,而不是用数据填充/渲染它。

在资源中环顾四周,我找不到这种方法。

你有什么想法我能做到这一点吗?

4

2 回答 2

3

您可以使用标记块raw

{% raw %}
    <div class="title">
         Hello {{ user }}
    </div>
    <div class="content">
         Some content
        <table>
          <tr>
            <td>
              {{ data }}
           </td>
          </tr>
        </table>
    </div>
{% endraw %}

http://jinja.pocoo.org/docs/templates/#escaping

于 2013-05-11T11:24:20.100 回答
1

这个问题很晚,但我一直在寻找这个确切问题的解决方案,但找不到任何解决方案。

最初,这个答案为问题中描述的问题提供了 3 个“解决方案”。但是在我和他们玩了一些之后,我意识到我错过了我们实际上想要实现的目标:

根据最初的问题,我们只想渲染{% block %}{% include %}(也许是{% macro %})表达式。我们无法解析{% if %}{% for %}表达式,因为它们需要变量的值(除非我们使用 const,但那是另一回事了)。

我提出的“解决方案”试图完全渲染模板,包括 if/for/set/call 表达式(和 Jinja2 过滤器),使用 Jinja2 的配置和内部代码。这并不成功,因为正如我所提到的,{% if A %}当我们不知道变量的值时,解析是没有意义的A

这让我相信解决这个问题的最简单方法不是使用 Jinja2,而是使用正则表达式解析includeandextends块:

  1. 查找此模板是否扩展了另一个。如果是这样,请阅读原始模板(这可以使用open(file_path, 'r')或使用 Jinja2get_source()函数来完成)

  2. 找到原始模板中的所有块并在“父”模板中替换它们。重复步骤 1+2,直到我们到达一个不扩展另一个模板。

  3. 查找所有{% include %}标签,读取包含文件的内容并将它们插入到模板中。

结果:一个模板解决了所有include问题extends……据我所知,这就是我们所追求的。

于 2022-01-15T09:51:29.713 回答