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

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

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


当前回答

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

为目的。

其他回答

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

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

结果:

it worked

像这样摆好

{% set active_link = recordtype -%}

多变量赋值的很好速记

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

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

为目的。