【问题标题】:How to render block using jinja2 API如何使用 jinja2 API 渲染块
【发布时间】:2014-01-14 19:50:39
【问题描述】:

我想用 jinja2 编写我自己的静态页面生成器。我想在特定的块中以编程方式呈现一些东西。我试过这个:

import jinja2

a = "adam"
b = "bob"

template = jinja2.Template(u"{{ A }} {% block b %}{% endblock %}")

html = template.render({'A': a, 'B': b})

print(html)

但返回以下输出:adam。如何在 b 块中呈现一些文本和/或变量(例如变量 b)。

【问题讨论】:

  • 感谢您提供简洁的代码示例。但是您能否更具体一点:您希望输出为adam,还是您得到adam 但期待其他结果?
  • 我意识到我的问题是“如何在特定块中渲染某些东西”,我正在更新问题。
  • 我有点困惑你为什么要这样做。为什么不直接使用{{ B }}?当您需要使用您未使用的子模板的值填充块时,通常会使用您提供的块。
  • 老实说,我试图模仿鹈鹕的行为,但实际上最好的解决方案不是自己搜索更新块,而是在其中插入一个 {{ ... }}。

标签: python jinja2


【解决方案1】:

模板块仅用于模板继承。因此,例如,当您有第二个模板扩展了前一个模板时,您可以通过在继承的模板中填充块来替换创建的块。

但是,当调用render() 时,您传递的模板上下文只定义了在模板内部使用的变量。模板不能填充块,因此您的B 不会只是出现。该块的内容仍然是空的,因此不会出现任何内容。

如果要显示变量内容,则必须像为A 所做的那样指定一个变量。但是,您可以将两者结合起来并提供一个块B,默认内容是变量输出。然后在继承的模板中,您仍然可以用其他内容覆盖该块。

template = jinja2.Template(u"{{ A }} {% block B %}{{ B }}{% endblock %}")
template.render({'A': a, 'B': b})

顺便说一句:块和变量实际上可以共享相同的名称而不会相互冲突。

【讨论】:

  • 正确:除了b 应该是块中的B
  • @MarkHildreth 对;或两者都B,因为我实际上想强调将它们命名为相同的可能性。已修复,谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多