如何在 Jinja 中创建包含模板后面的值的标签?

发布于 2024-07-13 02:11:17 字数 693 浏览 6 评论 0原文

我正在使用 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 语句中出现的表达式。

最好的方法是什么?

I'm using Jinja2, and I'm trying to create a couple tags that work together, such that if I have a template that looks something like this:

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

I'd end up with the following:

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>

In other words, the my_summary() at the start of the page includes information provided later on in the page. It should be smart enough to take into account expressions which occur in include and import statements, as well.

What's the best way to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

丿*梦醉红颜 2024-07-20 02:11:17

免责声明:我不知道 Jinja。

我的猜测是你无法(轻松)完成此任务。

我建议采用以下替代方案:

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

模板:

{{ my_summary(list1 + list2) }}
... arbitrary HTML ...
{{ my_values(list1) }}
... arbitrary HTML ...
{{ my_values(list2) }}

控制器:

def a_controller_method(request):
    return render_template('templatefilename', {
        'list1': ['Dick', 'Tom', 'Harry'],
        'list2': ['Fred', 'Barney']})
  • 如果从外部传递值不可行,我建议您在模板的顶部定义它们,如下所示:
{% set list1 = ['Dick', ...] %}
{% set list2 = ['Fred', ...] %}
{{ my_summary(list1 + list2) }}
... arbitrary HTML ...
{{ my_values(list1) }}
... arbitrary HTML ...
{{ my_values(list2) }}

Disclaimer: I do not know Jinja.

My guess is that you cannot (easily) accomplish this.

I would suggest the following alternative:

  • Pass the Tom, Dick, etc. values as variables to the template from the outside.
  • Let your custom tags take the values as arguments.
  • I do not know what "the outside" would be in your case. If the template is used in a web app framework, "the outside" is probably a controller method.
  • For instance:

Template:

{{ my_summary(list1 + list2) }}
... arbitrary HTML ...
{{ my_values(list1) }}
... arbitrary HTML ...
{{ my_values(list2) }}

Controller:

def a_controller_method(request):
    return render_template('templatefilename', {
        'list1': ['Dick', 'Tom', 'Harry'],
        'list2': ['Fred', 'Barney']})
  • If passing the values from the outside is not feasible, I suggest you define them at the top of your template, like this:
{% set list1 = ['Dick', ...] %}
{% set list2 = ['Fred', ...] %}
{{ my_summary(list1 + list2) }}
... arbitrary HTML ...
{{ my_values(list1) }}
... arbitrary HTML ...
{{ my_values(list2) }}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文