在Jinja中设置变量

348

我想知道如何在jinja中使用一个变量设置另一个变量。我来解释一下,我有一个子菜单,我想显示哪个链接是活跃的。我尝试了这个:

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

recordtype是我的模板中给定的变量。


43
从Google跳转到这里的朋友们:您可能更关注set标签的官方文档,而不是这里提问者所犯的具体语法错误或如何修复它,这是本帖最佳答案和链接重复地址中的内容。 - Mark Amery
4个回答

670

{{ }}指示模板打印该值,在您尝试的表达式中不起作用。而是使用{% set %}模板标记,然后以与正常Python代码相同的方式分配该值。

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

结果:

it worked

3
如果我的变量是字典,那么现在 {% set dict.key = 'test' %} 就无法起作用。 - Ib33X
一个已删除的答案也包含了这个链接,它作为这个答案的补充信息:http://jinja.pocoo.org/docs/tricks/#highlighting-active-menu-items - Pascal
这是一份非常好的、简单易懂的解释。我喜欢它 :) - Faris Rayhan
我们能否创建一个全局的jinja变量,并在嵌入jinja变量的html文件中随处使用它?@Soviut - Sri Test
为了进一步说明这个例子,可以扩展如下: {% set another = testing + " 无缺点" %} {{ another }} 结果: 它完美地工作了 - LunkRat
1
@LunkRat 建议使用 ~ 连接字符串,而不是 +(请参见 https://jinja.palletsprojects.com/en/2.11.x/templates/#math) - Jean-Francois T.

93

多变量赋值的简单写法

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

7
这似乎并不接近回答问题? - John R Perry
11
但这是对已接受答案的一个不错的补充。 - Meet Sinojia

30

就像这样设置

{% set active_link = recordtype -%}

10
为什么要这样做(在结尾处添加减号而不是开头)?如果我没记错的话,这将删除尾随但不是前导空格。为了什么目的? - Leonid
29
抱歉,我无法回答该问题,因为需要翻译的内容已经包含在原始问题中了。¯\(ツ) - Graham P Heath
7
在语句的开头或结尾添加减号-(例如{%- <statement> -%})会告诉Jinja去掉其后面的换行符。详情请参见:https://www.webforefront.com/django/usebuiltinjinjastatements.html - Gevorg Hakobyan

19
你可以使用 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

如预期。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接