ChatGPT解决这个技术问题 Extra ChatGPT

I would like to know how can I set a variable with another variable in jinja. I will explain, I have got a submenu and I would like show which link is active. I tried this:

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

where recordtype is a variable given for my template.

Folks landing here from Google: you will probably be primarily interested in the official docs on the set tag, rather than the specific syntax mistake made by the asker here or how to fix it, which is what the top answers here and at the linked duplicate address.

S
Soviut

{{ }} tells the template to print the value, this won't work in expressions like you're trying to do. Instead, use the {% set %} template tag and then assign the value the same way you would in normal python code.

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

Result:

it worked

if my variable is dict what now {% set dict.key = 'test' %} don't work
A deleted answer also included this link, which serves as supplementary information to this answer: jinja.pocoo.org/docs/tricks/#highlighting-active-menu-items
It was great explanation and simple one. Love it :)
can we create a global jinja variable and use it throughout the html file in which we embed the jinja variable? @Soviut
To further illustrate by extending this example: {% set another = testing + " flawlessly" %} {{ another }} Result: it worked flawlessly
p
pymen

Nice shorthand for Multiple variable assignments

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

This doesn't seem to come close to answering the question?
@JohnRPerry But it is a nice addition to the accepted answer.
C
Chad Pierce

Just Set it up like this

{% set active_link = recordtype -%}

Why specifically like so (the minus sign at the end but not at the beginning)? This would remove trailing but not leading whitespace, if I am not mistaken. To what end?
Its in the original question ¯\_(ツ)_/¯
The minus sign - appended to either the start or end of a statement (e.g. {%- <statement> -%}) tells Jinja to strip the new line that follows it. see webforefront.com/django/usebuiltinjinjastatements.html
a
andrewdotn

You can do this with the set tag. See the official documentation.

For example,

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

outputs

bar

Note: there are scoping issues which means that variable values don’t persist between loop iterations, for example, if you want some output to be conditional on a comparison between previous and current loop values:

{# **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 %}

prints

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

because the variable isn’t persisted. Instead you can use a mutable namespace wrapper:

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

which prints

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

as intended.