jinja2 - 在jinja2中生成动态字符串

标签 jinja2

在 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/

相关文章:

python - 相当于 Jinja2 中的 list(d.items())[0]

python - 在 Python Bottle 中使用模板

python - 如何在 Python/Ansible 中用模式 {{ '{{' }}/{{ '}}' }} 替换左大括号和右大括号 {{ }}

python - Airflow 使用 PythonOperator 的模板文件

python - 如何从 sqlalchemy 获取元数据以在 jinja 中显示为表格?

python - Python 中的 Pdf 类似 Jinja

templates - 在 jinja 的循环中求和一个值

jquery - Raspberry Pi - 使用 JQuery 的 Flask 服务器无法离线工作(在线工作)

Python、Jinja2 nl2br 和安全性