【问题标题】:How can I create a tag in Jinja that contains values from later in the template?如何在 Jinja 中创建包含模板后面的值的标签?
【发布时间】:2010-10-06 20:24:57
【问题描述】:

我正在使用 Jinja2,我正在尝试创建几个可以协同工作的标签,如果我有一个看起来像这样的模板:

{{ my_summary() }}
... arbitrary HTML ...
{{ my_values('Tom', 'Dick', 'Harry') }}
... arbitrary HTML ...
{{ my_values('Fred', 'Barney') }}

我最终会得到以下结果:

This page includes information about <b>Tom</b>, <b>Dick</b>, <b>Harry</b>, <b>Fred</b>, and <b>Barney</b>.
... arbitrary HTML ...
<h1>Tom, Dick, and Harry</h1>
... arbitrary HTML ...
<h1>Fred and Barney</h1>

换句话说,页面开头的 my_summary() 包含页面稍后提供的信息。它应该足够聪明,可以考虑出现在includeimport 语句中的表达式。

最好的方法是什么?

【问题讨论】:

  • @Chris B. 不清楚的一件事是值列表来自哪里?你知道模板渲染之前的子列表吗?如果您当时不知道它们,这似乎表明您的模板正在承担控制器的责任(就 MVC 而言,松散地说)。
  • 我基本上是在使用包含的模板来绘制小部件,这些小部件需要某些 css 和 js 文件才能运行。 css 和 js 进入基本模板,而稍后包含的模板呈现小部件。所以没有办法先验地知道以后需要哪些库。

标签: python templating jinja2


【解决方案1】:

免责声明:我不知道 Jinja。

我的猜测是你不能(轻易地)做到这一点。

我建议以下替代方案:

  • 将 Tom、Dick 等值作为变量从外部传递给模板。
  • 让您的自定义标签将值作为参数。
  • 我不知道你的情况是什么“外部”。如果模板用于 Web 应用框架中,“外部”可能是控制器方法。
  • 例如:

模板:

{{ my_summary(list1 + list2) }} ... 任意 HTML ... {{ my_values(list1) }} ... 任意 HTML ... {{ my_values(list2) }}

控制器:

def a_controller_method(请求): 返回渲染模板('模板文件名',{ 'list1':['迪克','汤姆','哈利'], 'list2':['弗雷德','巴尼']})
  • 如果从外部传递值不可行,我建议您在模板顶部定义它们,如下所示:
{% set list1 = ['Dick', ...] %} {% set list2 = ['Fred', ...] %} {{ my_summary(list1 + list2) }} ... 任意 HTML ... {{ my_values(list1) }} ... 任意 HTML ... {{ my_values(list2) }}

【讨论】:

  • 如果我知道页面开头的所有值,我就不会遇到这个问题。目标是定义一个父模板(使用 my_summary()),它可以有定义 my_values() 的子模板。在渲染过程开始时,父母不需要知道它是否这样做。
猜你喜欢
  • 1970-01-01
  • 2011-07-08
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 2012-11-03
  • 1970-01-01
  • 2013-04-14
相关资源
最近更新 更多