2013-09-16 77 views
13

Tôi đang cố truy xuất các mục từ một từ điển python trong jinja2, nhưng vấn đề là tôi không biết khóa nào tôi muốn truy cập trước - khóa được lưu trữ trong một biến có tên là s.course. Vì vậy, vấn đề của tôi là tôi cần phải thay thế hai biến này. Tôi không muốn sử dụng vòng lặp for bởi vì điều đó sẽ trải qua cách từ điển nhiều hơn mức cần thiết. Đây là một cách giải quyết mà tôi đã tạo, nhưng có thể các giá trị s.course có thể thay đổi để rõ ràng việc mã hóa chúng như thế này là xấu. Tôi muốn nó hoạt động cơ bản như thế này:Cách lấy các giá trị từ điển trong jinja khi khóa là một biến?

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

Nhưng tôi muốn nó trông như thế này:

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

Cảm ơn!

+0

Tại sao không phải là một đối tượng thực tế đại diện cho mã dĩ nhiên có liên quan được thông qua với mẫu không? –

Trả lời

18

Bạn có thể sử dụng 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

Tôi đang sử dụng Jinja với muối, và tôi đã phát hiện ra rằng một cái gì đó giống như các công việc sau tốt:

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

Đó là, sử dụng các chi tiết verbose [ ] cú pháp và để lại dấu ngoặc kép khi bạn cần sử dụng biến.

5

Không có nhu cầu sử dụng các ký hiệu dấu chấm ở tất cả, bạn có thể làm:

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