ChatGPT解决这个技术问题 Extra ChatGPT

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

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

其中记录类型是为我的模板提供的变量。

从 Google 登陆这里的人们:您可能主要对 official docs on the set tag 感兴趣,而不是提问者在此处犯的特定语法错误或如何修复它,这是此处和链接的重复地址的最佳答案。

S
Soviut

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

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

结果:

it worked

如果我的变量是 dict 现在 {% set dict.key = 'test' %} 不起作用
已删除的答案还包括此链接,该链接可作为此答案的补充信息:jinja.pocoo.org/docs/tricks/#highlighting-active-menu-items
这是一个很好的解释和简单的解释。爱它 :)
我们可以创建一个全局 jinja 变量并在我们嵌入 jinja 变量的整个 html 文件中使用它吗? @苏维特
通过扩展此示例进一步说明:{% set another = testing + " flawlessly" %} {{ another }} 结果:it worked flawlessly
p
pymen

多变量赋值的好速记

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

这似乎没有接近回答这个问题?
@JohnRPerry 但这是对已接受答案的一个很好的补充。
C
Chad Pierce

像这样设置它

{% set active_link = recordtype -%}

为什么特别喜欢这样(末尾的减号而不是开头的减号)?如果我没记错的话,这将删除尾随但不是前导的空格。达到什么目的?
它在原始问题¯\_(ツ)_/¯
减号 - 附加到语句的开头或结尾(例如 {%- <statement> -%})告诉 Jinja 删除它后面的新行。见webforefront.com/django/usebuiltinjinjastatements.html
a
andrewdotn

您可以使用 set 标记执行此操作。请参阅 official documentation

例如,

{% 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

如预期。