Odoo 13自定义模块货币字段无法保存0值,自动恢复原值求助
Odoo 13自定义模块货币字段无法保存0值问题解决
问题分析
自定义模块中Monetary类型字段设置为0后点击保存,值自动恢复为修改前的数值,标准模块无此问题。核心原因是货币字段依赖的currency_id字段定义或视图处理存在异常,导致Odoo在保存时无法识别0值的合法性,进而回滚字段值。
解决方案
1. 修正currency_id字段定义
当前currency_id同时设置了related和default,会导致字段值初始化和同步逻辑冲突。移除default参数,仅保留related关联:
# .py文件中修改后的字段声明 company_id = fields.Many2one('res.company', store=True, copy=False, string="Company", default=lambda self: self.env.user.company_id.id) currency_id = fields.Many2one('res.currency', string="Currency", related='company_id.currency_id') # 移除default参数 fee = fields.Monetary(string="Fee")
2. 确保视图中currency_id字段的正确提交
虽然设置了invisible="1",但需确保字段在表单提交时能被正确传递。可将invisible改为通过attrs控制(即使逻辑上始终不可见),避免Odoo忽略该字段:
<!-- .xml文件中修改后的视图字段 --> <field name="currency_id" attrs="{'invisible': [('id', '!=', False)]}" /> <field name="fee"/>
或保持原invisible="1",但确认表单视图未设置create="false"/edit="false"等限制,确保字段能正常提交。
3. 强制在保存时绑定currency_id
若上述方法无效,可在模型的create和write方法中强制设置currency_id,确保货币字段有合法关联货币:
def create(self, vals): if 'fee' in vals and not vals.get('currency_id'): vals['currency_id'] = self.env.user.company_id.currency_id.id return super().create(vals) def write(self, vals): for record in self: if 'fee' in vals and vals['fee'] == 0 and not vals.get('currency_id'): vals['currency_id'] = record.company_id.currency_id.id return super().write(vals)
4. 排查自定义逻辑干扰
检查模型中是否存在onchange方法、计算字段或约束条件,是否有逻辑在保存前将fee字段值重置为非0值。例如,若有@api.onchange方法修改fee,需确保0值不会被覆盖。
内容的提问来源于stack exchange,提问作者Sateesh MM
相关产品推荐
相关产品推荐

