You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Saleor平台下Pybars无法编译Jinja模板if条件与for循环问题咨询

问题根因

Pybars是Handlebars模板引擎的Python实现,仅支持Handlebars原生的控制语句语法,不兼容Jinja模板的{% if %}、{% for %}格式的控制块语法,因此你代码中的Jinja控制语句会被Pybars识别为普通文本,仅变量插值{{ 变量名 }}刚好和Handlebars语法一致能正常渲染,控制逻辑完全不生效。

解决方案1:改为Pybars兼容的Handlebars语法

直接修改模板的控制语句为Handlebars格式即可,if判断用{{#if 条件}}开头、{{/if}}闭合,for循环用{{#each 可迭代对象}}开头、{{/each}}闭合,循环内的当前元素用{{this}}取值。

修改后的完整可运行代码如下:

context = {
    "site_name": "site_name",
    "order": {
        "items": [
            "one",
            "two",
            "three",
        ]
    },
}

# 替换为Handlebars语法的模板
source = """
    {{#if True}}
        <div>
            {{ site_name}}
        </div>
    {{/if}}

    <div>
        {{#each order.items}}
        <tr>
            {{ this }}
        </tr>
        {{/each}}
    </div>

    <div>
        <p><small>This email was sent to <a href="mailto:{{site_name}}">{{site_name}}</a>.</p>
    </div>
"""

from pybars import Compiler
compiler = Compiler()
template = compiler.compile(source)
print(template(context))

运行后会正常输出判断后的内容和循环的所有条目。

解决方案2:保留原有Jinja语法,替换模板引擎为Jinja2

如果不想修改现有Jinja格式的邮件模板,直接弃用Pybars,改用Jinja2引擎编译即可:

context = {
    "site_name": "site_name",
    "order": {
        "items": [
            "one",
            "two",
            "three",
        ]
    },
}

source = """
    {% if True %}
        <div>
            {{ site_name}}
        </div>
    {% endif %}

    <div>
        {% for line in order.items %}
        <tr>
            {{ line }}
        </tr>
        {% endfor %}
    </div>

    <div>
        <p><small>This email was sent to <a href="mailto:{{site_name}}">{{site_name}}</a>.</p>
    </div>
"""

from jinja2 import Template
template = Template(source)
print(template.render(context))

内容的提问来源于stack exchange,提问作者Chetan Ganji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 01:00:04