How to get values from dictionary in jinja when key is a variable?

I'm trying to retrieve entries from a python dictionary in jinja2, but the problem is I don't know what key I want to access ahead of time - the key is stored in a variable called s.course. So my problem is I need to double-substitute this variable. I don't want to use a for loop because that will go through the dictionary way more than is necessary. Here's a workaround that I created, but it's possible that the s.course values could change so obviously hard-coding them like this is bad. I want it to work essentially like this:

{% if s.course == "p11" %} {{course_codes.p11}} {% elif s.course == "m12a" %} {{course_codes.m12a}} {% elif s.course == "m12b" %} {{course_codes.m12b}} {% endif %} 

But I want it to look like this:

{{course_codes.{{s.course}}}} 

Thanks!

1

3 Answers

You can use course_codes.get(s.course):

>>> import jinja2 >>> env = jinja2.Environment() >>> t = env.from_string('{{ codes.get(mycode) }}') >>> t.generate(codes={'a': '123'}, mycode='a').next() u'123' 
2

There is no need to use the dot notation at all, you can do:

"{{course_codes[s.course]}}" 
1

I'm using Jinja with Salt, and I've found that something like the following works well:

{% for role in pillar.packages %} {% for package in pillar['packages'][role] %} install_{{ package }}: pkg.installed: - name: {{ package }} {% endfor %} {% endfor %} 

That is, use the more verbose [ ] syntax and leave the quotes out when you need to use a variable.

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like