Odoo 16对账功能因字段翻译设置触发JS TypeError求助
问题分析及解决方案
问题根源
Odoo 16 对启用translate=True的字符字段返回格式做了调整:
- Odoo 14 中,
translate=True的Char字段向前端返回原始字符串 - Odoo 16 中,这类字段会返回翻译对象(格式类似
{"lang": "zh_CN", "value": "实际名称"})
对账功能的JS代码仍按字符串处理m2o_value,调用trim()方法时,因为对象没有该方法,直接抛出错误。另外,display_name作为Odoo内置的计算字段,本身已有翻译逻辑,手动添加translate=True会触发额外冲突,是核心诱因之一。
解决步骤
1. 优先移除display_name的translate=True配置
display_name是Odoo为模型自动生成的计算字段,框架内部已处理多语言翻译,手动添加translate=True会破坏原有逻辑,直接修改字段定义:
# 移除display_name的translate=True配置 display_name = fields.Char()
2. 保留name/company_name翻译的兼容方案
如果确实需要这两个字段支持翻译,可通过以下两种方式解决JS兼容问题:
方案A:前端JS修改(针对对账模块)
找到对账功能相关的JS文件(通常位于account_reconciliation模块的static/src/js目录下),定位到触发错误的代码行,将字符串处理逻辑改为兼容翻译对象的格式:
// 原代码 // (this.m2o_value||"").trim() // 修改后 (this.m2o_value?.value || this.m2o_value || "").trim()
这里通过?.value优先读取翻译对象中的实际字符串值,若本身是字符串则直接使用,兼容两种格式。
方案B:后端字段兼容处理
重写name和company_name字段的读取逻辑,确保向前端返回原始字符串而非翻译对象,可通过重写模型的_read方法实现:
from odoo import models, fields class ResPartner(models.Model): _inherit = 'res.partner' name = fields.Char(translate=True) company_name = fields.Char(translate=True) def _read(self, fields): super()._read(fields) # 将翻译对象转换为字符串返回给前端 for record in self: if 'name' in fields and isinstance(record.name, dict): record.name = record.name.get(self.env.lang, record.name.get('value', '')) if 'company_name' in fields and isinstance(record.company_name, dict): record.company_name = record.company_name.get(self.env.lang, record.company_name.get('value', ''))
验证修改
完成配置调整后,刷新Odoo前端缓存(Ctrl+Shift+R),重新打开对账功能,确认JS错误消失,功能恢复正常。
内容的提问来源于stack exchange,提问作者Moaz Mabrok
相关产品推荐
相关产品推荐

