【问题标题】:How to get values from dictionary in jinja when key is a variable?当键是变量时,如何从 jinja 中的字典中获取值?
【发布时间】:2013-09-16 14:22:39
【问题描述】:

我正在尝试从 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 %}

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

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

谢谢!

【问题讨论】:

  • 为什么没有一个代表相关课程代码的实际对象被传递给模板?

标签: python variables dictionary jinja2 substitution


【解决方案1】:

你可以使用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'

【讨论】:

  • 这将返回错误Could not parse the remainder: '('a')' from 'codes.get('a')'。甚至 {{course_codes[s.course]}} 都不适合我。
  • 即使我也遇到了同样的问题,请问你是怎么解决的?
【解决方案2】:

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

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

【讨论】:

  • 当我尝试像上面那样使用时,它返回无法解析剩余部分:'[s.sample_type]' from 'samType[s.sample_type]'
【解决方案3】:

我将 Jinja 与 Salt 一起使用,我发现类似以下的方法效果很好:

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

也就是说,使用更冗长的[ ] 语法,并在需要使用变量时省略引号。

【讨论】:

    猜你喜欢
    • 2019-07-06
    • 2015-09-05
    • 2014-03-22
    • 2018-12-03
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多