2013-09-16 3 views
13

Ich versuche, Einträge aus einem Python-Wörterbuch in jinja2 abzurufen, aber das Problem ist, ich weiß nicht, auf welchen Schlüssel ich im Voraus zugreifen möchte - der Schlüssel wird in einer Variablen namens s.course gespeichert. Also mein Problem ist, dass ich diese Variable doppelt ersetzen muss. Ich möchte nicht eine for Schleife verwenden, weil das durch das Wörterbuch viel mehr als notwendig durchlaufen wird. Hier ist ein Workaround, den ich erstellt habe, aber es ist möglich, dass sich die s.course Werte ändern könnten, so dass es offensichtlich schwierig ist, sie so zu codieren, dass sie schlecht sind. Ich möchte es im Wesentlichen wie dies funktioniert:Wie bekomme ich Werte aus dem Wörterbuch in Jinja, wenn der Schlüssel eine Variable ist?

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

Aber ich will es so aussehen:

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

Dank!

+0

Warum ist nicht ein tatsächliches Objekt des entsprechenden Kurs-Codes, die auf die Vorlage übergeben wird? –

Antwort

18

können Sie course_codes.get(s.course) verwenden:

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

I Jinja mit Salz bin mit, und ich habe festgestellt, dass so etwas wie die folgenden Arbeiten gut:

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

Das heißt, verwenden Sie die mehr Ausführlich [ ] Syntax und lassen Sie die Anführungszeichen aus, wenn Sie eine Variable verwenden müssen.

5

Es gibt keine Notwendigkeit besteht, die Punktnotation überhaupt zu benutzen, können Sie tun:

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