如何将Jinja2模板输出存储为字符串

3
我希望使用Jinja2将模板存储为Python中的字符串变量,而不是作为文件进行渲染。我该如何操作?
例如,我想使用f-strings来达到这个目的:
template = f""" This is a {foo}"""

很遗憾,f-strings不能满足我的需求,因此我想尝试一下Jinja2。 编辑: 要求
cars = {
  'tesla': {
    'cost': '34000',
    'length': '185',
    'range': '220',
  },
  'chevy': {
    'cost': '37000',
    'length': '134',
    'range': '238',
  }

我想从这个字典中提取数值,将其插入模板并将其存储为字符串以便稍后使用。我尝试使用下面的代码,但是出现了无效语法错误。"最初的回答"
template1 = Template("""Tesla 
                        Cost : {{ cars.tesla.cost }}""")
template2 = template1.render()

# Expected Output
print(template2)
Tesla
Cost : 34000
1个回答

4

如果你的需求不明确,一个把jinja2模板存储到变量的简单方法是使用Template类。下面这个来自jinja2文档的例子展示了如何实现:

from jinja2 import Template
template = Template('Hello {{ name }}!')

如果我打印template,它会显示存储在内存中的Template对象:
print(template)
#Output
<Template memory:2ea4e10>

您可以在render()中传递自定义名称,并打印带有name值的模板:
print(template.render(name='John Wick'))
#Output:
Hello John Wick!

一个稍微复杂一点的模板可以储存在一个简单的变量里,并传递给 Template
jinja_string = """<title>{{title}}</title>
<ul>
{% for user in users %}
  <li>{{ user }}</li>
{% endfor %}
</ul>"""

template = Template(jinja_string)
users = ["John", "Sam", "Joe"]
print(template.render(title="Users", users=users))

#Output:
<title>Users</title>
<ul>

  <li>John</li>

  <li>Sam</li>

  <li>Joe</li>

</ul>

对于预期的输出模板:

jinja_string = """{{title}}:
{% for car,value in cars.items() %}  
  Car: {{ car }}
  Cost: {{value['cost']}}
  Length: {{value['length']}}
  Range: {{value['range']}}
{% endfor %}
"""

template = Template(jinja_string)

cars = {
  'tesla': {
    'cost': '34000',
    'length': '185',
    'range': '220',
  },
  'chevy': {
    'cost': '37000',
    'length': '134',
    'range': '238',
  }
}

print(template.render(title="Cars", cars=cars))
#Output:
Cars:

  Car: tesla
  Cost: 34000
  Length: 185
  Range: 220

  Car: chevy
  Cost: 37000
  Length: 134
  Range: 238

谢谢您的回复。我已经编辑了我的问题并添加了一些要求。 - user10907327

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接