Как получить значения из словаря в jinja, когда ключ является переменной?

Я пытаюсь получить записи из словаря python в jinja2, но проблема в том, что я не знаю, к какому ключу я хочу получить доступ раньше времени - ключ хранится в переменной с именем s.course. Поэтому моя проблема заключается в том, что мне нужно заменить эту переменную на две части. Я не хочу использовать цикл for, потому что это будет проходить через словарь намного больше, чем это необходимо. Вот обходной путь, который я создал, но возможно, что значения s.course могут измениться, поэтому, очевидно, их жесткое кодирование, как будто это плохо. Я хочу, чтобы он работал в основном так:

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

Но я хочу, чтобы это выглядело так:

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

Спасибо!

Ответ 1

Вы можете использовать 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

Нет необходимости использовать точечную нотацию, вы можете сделать:

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

Ответ 3

Я использую Jinja с Salt, и я обнаружил, что что-то вроде следующего хорошо работает:

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

То есть, используйте более подробный синтаксис [ ] и оставьте кавычки, когда вам нужно использовать переменную.