当key是变量时,如何从jinja中的字典中获取值?

tyt*_*ytk 17 python variables dictionary substitution jinja2

我正在尝试从jinja2中的python字典中检索条目,但问题是我不知道我想提前访问什么密钥 - 密钥存储在一个名为的变量中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 %}
Run Code Online (Sandbox Code Playgroud)

但我希望它看起来像这样:

{{course_codes.{{s.course}}}}
Run Code Online (Sandbox Code Playgroud)

谢谢!

Rol*_*Max 23

你可以使用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'
Run Code Online (Sandbox Code Playgroud)


Mik*_*lla 8

根本不需要使用点符号,您可以这样做:

"{{course_codes[s.course]}}"
Run Code Online (Sandbox Code Playgroud)

  • 当我尝试使用上面的方法时,它返回无法解析其余部分:'[s.sample_type]' from 'samType[s.sample_type]' (2认同)

onl*_*egg 6

我正在将 Jinja 与 Salt 一起使用,我发现类似以下内容的效果很好:

{% for role in pillar.packages %}
  {% for package in pillar['packages'][role] %}
    install_{{ package }}:
      pkg.installed:
        - name: {{ package }}
  {% endfor %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

也就是说,[ ]当您需要使用变量时,使用更详细的语法并省略引号。