Odoo14电商订单确认邮件模板多银行账户调用报错与指定查询
嗨,这个问题我之前做Odoo模板开发时也碰到过,其实核心原因是你调用的bank_ids是一个记录集(recordset)——当只有一个银行账户时,它是单条记录(singleton),直接取字段没问题;但新增第二个后,它变成了多条记录的集合,Odoo没法自动判断你要取哪一条,所以就抛出了Expected singleton的错误。
给你几个实用的解决思路,按需选就行:
1. 固定指定某一个银行账户
如果你只想显示特定ID的银行账户,可以用filtered方法精准筛选,比如要取ID为2的账户:
${object.company_id.bank_ids.filtered(lambda b: b.id == 2).acc_holder_name or ''} ${object.company_id.bank_ids.filtered(lambda b: b.id == 2).bank_name or ''} ${object.company_id.bank_ids.filtered(lambda b: b.id == 2).acc_number or ''}
末尾加or ''是为了防止筛选不到时模板报错,会显示空字符串。
或者你想取第一个创建的账户,也可以直接用索引(记得加判断避免无账户时出错):
${object.company_id.bank_ids[0].acc_holder_name if object.company_id.bank_ids else ''}
2. 遍历显示所有银行账户
如果需要把公司所有银行账户都列在邮件里,用QWeb的循环语法就行,这样不管有多少个账户都能正常显示:
% for bank in object.company_id.bank_ids: - 账户持有人:${bank.acc_holder_name} - 银行名称:${bank.bank_name} - 账号:${bank.acc_number} <br/> % endfor
3. 给公司设置默认银行(更优雅的长期方案)
如果经常需要调用默认银行信息,推荐给res.company模型新增一个default_bank_id字段(关联res.partner.bank),然后在公司设置页面就能直接选择默认银行。之后模板里就可以这么调用:
${object.company_id.default_bank_id.acc_holder_name or ''} ${object.company_id.default_bank_id.bank_name or ''} ${object.company_id.default_bank_id.acc_number or ''}
这个方法不用硬编码ID,后续维护起来更方便。
内容的提问来源于stack exchange,提问作者george
相关产品推荐
相关产品推荐

