2013-09-16 30 views
13

Próbuję pobrać wpisy ze słownika Pythona w jinja2, ale problem polega na tym, że nie wiem, do którego klucza chcę uzyskać dostęp z wyprzedzeniem - klucz jest przechowywany w zmiennej o nazwie s.course. Więc moim problemem jest potrzeba podwójnego zastąpienia tej zmiennej. Nie chcę używać pętli for, ponieważ będzie ona przechodzić przez słownik znacznie bardziej, niż jest to konieczne. Oto rozwiązanie, które stworzyłem, ale możliwe, że wartości s.course mogą się zmienić, więc oczywiście ich kodowanie jest złe. Chcę go do pracy w zasadzie tak:Jak uzyskać wartości ze słownika w jinja, gdy klucz jest zmienną?

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

Ale chcę, żeby wyglądać tak:

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

Dzięki!

+0

Dlaczego nie jest rzeczywisty obiekt reprezentujący odpowiednie kody kursu były przekazywane do szablonu? –

Odpowiedz

18

Można użyć 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

używam Jinja solą i odkryłem, że coś następujących utworów dobrze:

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

Oznacza to, że należy użyć więcej verbose [ ] składnia i pozostaw cytaty, gdy potrzebujesz użyć zmiennej.

5

Nie ma potrzeby używać notacji kropki w ogóle można zrobić:

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