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

Odoo创建/更新记录时ValidationError弹窗不显示问题

问题分析与解决方案

核心问题

你的allocated_hours是计算字段,而@api.constrains注解的机制是监听字段的直接写入操作。计算字段的值由_compute_allocated_hours方法推导,不会被直接写入数据库,因此:

  • 更新记录时,约束仅在控制台报错(后端触发但前端未捕获反馈)
  • 创建新记录时,计算字段还未完成计算,约束方法完全不触发

修复方案

1. 修改约束的依赖字段

把@api.constrains的监听目标改为计算字段allocated_hours所依赖的原始业务字段(比如你是从task_hours、overtime_hours这类字段求和得到allocated_hours,就把这些字段作为constrains的参数)。这样当原始字段变化时,约束会被正确触发,前端也能正常接收错误提示。

示例(假设依赖字段为task_hours和overtime_hours):

allocated_hours = fields.Integer('Estimation', compute='_compute_allocated_hours')

@api.depends('task_hours', 'overtime_hours')
def _compute_allocated_hours(self):
    for record in self:
        record.allocated_hours = record.task_hours + record.overtime_hours

@api.constrains('task_hours', 'overtime_hours')
def _check_allocated_hours(self):
    max_hours = 24
    for record in self:
        if record.allocated_hours > max_hours:
            raise ValidationError("最大允许时长为24小时!")

2. 前端实时验证(可选增强)

如果要在用户输入时就给出提示,避免提交后报错,可以在视图的依赖字段上添加前端校验:

<!-- 对输入字段添加前端最大值限制 -->
<field name="task_hours" modifiers="{'validate': {'max': 24}}"/>
<field name="overtime_hours" modifiers="{'validate': {'max': 24}}"/>
<!-- 计算字段设为只读,避免用户直接修改 -->
<field name="allocated_hours" readonly="1"/>

3. 手动触发约束(特殊场景备用)

如果必须基于计算字段做约束(不推荐),可以在计算方法末尾手动调用约束方法,确保计算完成后立即校验:

@api.depends('task_hours', 'overtime_hours')
def _compute_allocated_hours(self):
    for record in self:
        record.allocated_hours = record.task_hours + record.overtime_hours
    # 计算完成后手动触发约束校验
    self._check_allocated_hours()

@api.constrains('task_hours', 'overtime_hours')
def _check_allocated_hours(self):
    max_hours = 24
    for record in self:
        if record.allocated_hours > max_hours:
            raise ValidationError("最大允许时长为24小时!")

关键注意事项

  • 计算字段的约束必须依赖原始输入字段,这是Odoo ORM的设计逻辑,不能直接监听计算字段
  • 前端验证仅提升用户体验,后端约束必须保留(防止绕过前端直接修改数据库)
  • 错误提示建议使用用户易懂的语言,避免硬编码非目标用户的语言

内容的提问来源于stack exchange,提问作者Rahma Begag

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 00:26:00