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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:27:20