Jinja2的generate()返回整个rst模板

1 投票
1 回答
797 浏览
提问于 2025-04-18 08:26

我正在尝试创建一个restructuredText文档(我会用rst2pdf来处理),并使用Jinja2来填充其中的值。文档中的一些要点需要根据外部因素来决定是否包含,所以当我发现Jinja2有一个[generate()][1]函数可以生成一个生成器时,我觉得这正好适合这个任务。

不过,使用后我发现生成器里只有整个rst模板(已经填入值),而不是我希望的按行分开的内容。而且,我在链接的文档之外找不到关于generate()的更多信息,所以我不太确定需要修复哪个方面。

这是我的代码:

doc_info = {"name": "Kaladin",
            "address": "Shattered Plains",}

env = Environment(loader=PackageLoader('src', 'templates'))

template = env.get_template("Example.rst")

template_gen = template.generate(doc_info)

print template_gen.next()  # Would be looped if it worked as expected

示例.rst:

.. header::

  +--------------------------------------------------------+
  |.. class:: center                                       |
  |                                                        |
  |**User Info**                                           |
  +------------------+-------------------------------------+
  |.. class:: right  |.. class:: left                      |
  |                  |                                     |
  |Name:             |{{ name }}                           |
  +------------------+-------------------------------------+
  |.. class:: right  |.. class:: left                      |
  |                  |                                     |
  |Address:          |{{ address }}                        |
  +------------------+-------------------------------------+

{{ name }} lives in {{ address }}

注意:在这个例子中,由于nameaddress的长度不同,表格会出现错位,但在我的实际代码中我会调整空格,所以这不是问题。

顺便说一下,使用render()的效果正如我所期待的,只是generate()没有给我预期的结果。

有没有办法指示我希望生成器的项目按行分开?还是我做错了什么?如果我使用不当,或者有更好的方法,我也很乐意接受。

1 个回答

3

虽然我来得有点晚(四年了!),但看起来 generate() 这个函数可以在循环和条件判断中使用,而你的模板里没有这些东西。

要决定输出中包含什么,可以使用 {% if <external.factor> %},并把外部因素传递给 generate(或者也许是 render() -- 不太清楚这个应用是否需要 generate())。

撰写回答