Odoo13生成发票时报jinja2 'loop'未定义及模板渲染失败错误
问题根因
报错核心是邮件模板存在Jinja2语法错误:loop是Jinja2的内置变量,仅能在{% for %}循环结构内部调用,你当前使用的销售订单确认邮件/发票模板,将loop相关代码写在了循环外部,或是缺失了{% endfor %}闭合标签,导致渲染时识别不到loop变量。
排查修复步骤
- 定位出错的模板
- 进入Odoo后台,激活开发者模式:路径为「设置」→ 页面底部点击「激活开发者模式」
- 依次进入「技术」→ 「电子邮件」→ 「模板」,搜索
销售订单确认邮件(系统原始模板xmlid为sale.mail_template_sale_confirmation),如果是生成发票时报错就搜索发票邮件模板 - 打开模板编辑页,切换到「进阶」标签,点击关联的
QWeb 视图进入模板代码编辑页
- 修正
loop语法错误
遍历模板代码中所有用到loop变量的位置:
- 确认所有
loop.index、loop.first、loop.last这类调用,完全包裹在{% for item in object.order_line %}(或其他for循环)的起止标签内,没有漏写{% endfor %} - 错误写法示例:
<span>行号:{{ loop.index }}</span> {% for line in order.order_line %} <!-- 行内容 --> {% endfor %}
- 正确写法示例:
{% for line in order.order_line %} <span>行号:{{ loop.index }}</span> <!-- 行内容 --> {% endfor %}
- 若模板是从更高版本Odoo复制而来,需删除高版本特有、Odoo13不支持的语法
- 验证修复效果
保存模板修改后,找一个测试销售订单手动触发发送确认邮件,或重新走一遍支付生成发票流程,确认不再抛出渲染错误。
注意事项
- 若近期安装了第三方销售、发票相关模块,可先临时禁用该模块复测,部分第三方模块会自带修改过的有语法错误的邮件模板
- 修改模板前建议先导出原始模板文件备份,避免改错后无法回滚
内容的提问来源于stack exchange,提问作者Deepak Raj
相关产品推荐
相关产品推荐

