376

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

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

where recordtype is a variable available in my template.

1
  • 55
    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. Commented Mar 3, 2019 at 20:33

4 Answers 4

721

{{ }} 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
Sign up to request clarification or add additional context in comments.

5 Comments

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
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
@LunkRat It is recommended to use ~ to concatenate strings, rather than + (see jinja.palletsprojects.com/en/2.11.x/templates/#math)
99

Nice shorthand for Multiple variable assignments

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

2 Comments

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

Just Set it up like this

{% set active_link = recordtype -%}

3 Comments

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
32

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.

1 Comment

Although the notice on mutable namespace in for loops is not answering the OP, it's something that is worth to mention.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.