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
相关产品推荐
相关产品推荐

