3

我正在使用 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() 包含页面稍后提供的信息。它应该足够聪明,可以考虑到includeandimport语句中出现的表达式。

最好的方法是什么?

4

1 回答 1

4

免责声明:我不知道 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) }}
于 2009-02-11T10:55:22.750 回答