在jinja中设置变量

Set variable in jinja

提问人:MyTux 提问时间:9/16/2010 最后编辑:davidismMyTux 更新时间:5/15/2022 访问量:506026

问:

我想知道如何在 jinja 中用另一个变量设置变量。我会解释,我有一个子菜单,我想显示哪个链接处于活动状态。我试过了这个:

{% set active_link = {{recordtype}} -%}

其中 recordtype 是为我的模板给出的变量。

Python 模板 变量赋值 jinja2

评论

43赞 Mark Amery 3/4/2019
从谷歌登陆这里的人:你可能主要对 set 标签上的官方文档感兴趣,而不是这里提问者所犯的具体语法错误或如何修复它,这是这里和链接的重复地址的顶级答案。

答:

670赞 Soviut 11/15/2010 #1

{{ }}告诉模板打印值,这在您尝试执行的表达式中不起作用。相反,请使用模板标记,然后以与普通 python 代码相同的方式分配值。{% set %}

{% set testing = 'it worked' %}
{% set another = testing %}
{{ another }}

结果:

it worked

评论

3赞 Ib33X 11/11/2011
如果我的变量是 dict what now {% set dict.key = 'test' %} 不起作用
0赞 Pascal 7/12/2016
已删除的答案还包括此链接,该链接作为此答案的补充信息:jinja.pocoo.org/docs/tricks/#highlighting-active-menu-items
0赞 Sri Test 6/19/2020
我们可以创建一个全局 Jinja 变量并在嵌入 Jinja 变量的 HTML 文件中使用它吗?@Soviut
0赞 LunkRat 7/1/2022
为了进一步说明,通过扩展此示例: 结果:{% set another = testing + " flawlessly" %}{{ another }}it worked flawlessly
1赞 Jean-Francois T. 1/28/2023
@LunkRat 建议用于连接字符串,而不是(请参阅 jinja.palletsprojects.com/en/2.11.x/templates/#math~+)
30赞 Chad Pierce 9/10/2014 #2

就这样设置吧

{% set active_link = recordtype -%}

评论

10赞 Leonid 11/7/2016
为什么特别喜欢这样(末尾的减号而不是开头的减号)?如果我没记错的话,这将删除尾随但不删除前导空格。为了什么目的?
29赞 Graham P Heath 4/26/2018
它在原来的问题̄\_(ツ)_/ ̄中
7赞 Gevorg Hakobyan 7/1/2021
减号 - 附加到语句的开头或结尾(例如 {%- <statement> -%})告诉 Jinja 去掉它后面的新行。查看 webforefront.com/django/usebuiltinjinjastatements.html
93赞 pymen 10/21/2016 #3

多个变量赋值的好速记

{% set label_cls, field_cls = "col-md-7", "col-md-3" %}

评论

7赞 John R Perry 8/22/2019
这似乎还不能回答这个问题?
11赞 Meet Sinojia 11/23/2020
@JohnRPerry 但它是对公认的答案的一个很好的补充。
19赞 andrewdotn 5/15/2022 #4

您可以使用标签执行此操作。请参阅官方文档set

例如

{% set foo = "bar" %}
{{ foo }}

输出

bar

注意:存在范围问题,这意味着变量值在循环迭代之间不会持久存在,例如,如果您希望某些输出以先前循环值和当前循环值之间的比较为条件:

{# **DOES NOT WORK AS INTENDED** #}

{% set prev = 0 %}
{% for x in [1, 2, 3, 5] %}
{%- if prev != x - 1 %}⋮ (prev was {{ prev }})
{% endif -%}
{{ x }}
{%- set prev = x %}
{% endfor %}

指纹

1
⋮ (prev was 0)
2
⋮ (prev was 0)
3
⋮ (prev was 0)
5

因为变量不会持久化。相反,您可以使用可变命名空间包装器:

{% set ns = namespace(prev=0) %}
{% for x in [1, 2, 3, 5] %}
{%- if ns.prev != x - 1 %}⋮ (ns.prev was {{ ns.prev }})
{% endif -%}
{{ x }}
{%- set ns.prev = x %}
{% endfor %}

哪些打印

1
2
3
⋮ (ns.prev was 3)
5

如预期。