在 jinja2 中,我想生成枚举事物的字符串,在本例中是不同的水果。我有以下模板文件。请注意,“Fruit_str not set”行是出于调试目的。
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
{% set fruit_str = "Fruit_str not set" %}
{% for fruit in fruits %}
{% if loop.first %}
{% set fruit_str = fruit %}
{% elif loop.last %}
{% set fruit_str = fruit_str + " and " + fruit + "." %}
{% else %}
{% set fruit_str = fruit_str + ", " + fruit %}
{% endif %}
{% endfor %}
You have {{fruit_str}}
</body>
</html>
获取此 JSON 作为输入
{ "fruits" : ["apples", "oranges", "bananas", "pears"] }
预期输出为
You have apples, oranges, bananas and pears.
然而,实际输出是
You have Fruit_str not set
这表明循环根本没有运行。 '我已阅读有关循环的 jinja2 文档 ( http://jinja.pocoo.org/docs/2.10/templates/ ),但我找不到此示例中的问题。这里出了什么问题?
最佳答案
在 Jinja2 中,for
循环有自己的命名空间;因此,您在循环内设置的变量是循环的本地变量,一旦在循环外,同名的变量将恢复为外部作用域的变量。
您可以使用命名空间
对象来解决此问题:
{% set ns = namespace(fruit_str="Fruit_str not set") %}
{% for fruit in fruits %}
{% if loop.first %}
{% set ns.fruit_str = fruit %}
{% elif loop.last %}
{% set ns.fruit_str = ns.fruit_str + " and " + fruit + "." %}
{% else %}
{% set ns.fruit_str = ns.fruit_str + ", " + fruit %}
{% endif %}
{% endfor %}
You have {{ns.fruit_str}}
请参阅 namespace
的文档了解详情。
关于jinja2 - 在jinja2中生成动态字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52343680/