web-dev-qa-db-fra.com

Comment obtenir des valeurs du dictionnaire dans jinja lorsque la clé est une variable?

J'essaie de récupérer des entrées d'un dictionnaire python dans jinja2, mais le problème est que je ne sais pas à quelle clé je veux accéder à l'avance - la clé est stockée dans une variable appelée s.course. Donc, mon problème est que je dois double-substituer cette variable. Je ne veux pas utiliser une boucle for car cela passera par le dictionnaire bien plus que nécessaire. Voici une solution de contournement que j'ai créée, mais il est possible que le s.course les valeurs peuvent changer, donc évidemment les coder en dur comme ça est mauvais. Je veux que cela fonctionne essentiellement comme ceci:

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

Mais je veux que ça ressemble à ceci:

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

Merci!

21
tytk

Vous pouvez utiliser 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'
27
R. Max

Il n'est pas nécessaire d'utiliser la notation par points, vous pouvez faire:

"{{course_codes[s.course]}}"
8
Mike Vella

J'utilise Jinja avec du sel et j'ai trouvé que quelque chose comme ce qui suit fonctionne bien:

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

Autrement dit, utilisez le _ plus verbeux [ ] syntaxe et omettez les guillemets lorsque vous devez utiliser une variable.

3
onlyanegg