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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:26:05