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

Odoo 12版本Date/Datetime字段Onchange函数重复触发异常问题

Odoo 12 Date字段Onchange函数异常触发问题

嘿,这个Odoo 12里Date字段的onchange坑我之前踩过!给你整理下问题细节和临时解决办法:

关键信息

  • 影响版本: Odoo 12
  • 对比表现: Char字段的Onchange函数仅在字段值与上次值不同时执行(符合预期),但Date字段却存在异常

问题复现步骤

  • 给Date字段绑定一个包含抛出ValidationError或UserError逻辑的Onchange函数
  • 触发错误后(比如示例中选择了当天日期),再次点击该Date字段准备修改,此时未修改字段值,Onchange函数就会持续执行,错误弹窗反复弹出,完全没法正常修改日期

示例代码

from odoo import models, api, fields
from odoo.exceptions import ValidationError
import datetime

class CustomModel(models.Model):
    _name = 'custom.model'

    today_date = fields.Date(string='Target Date')

    @api.onchange('today_date')
    def change_date(self):
        if self.today_date == datetime.datetime.today().date():
            raise ValidationError("Selected today's Date >>>>>>>>>>>>>>")

场景说明:当选择当天日期触发错误弹窗后,点击字段想修改为其他日期,还没完成选择操作,错误弹窗就会不停弹出。这个问题仅存在于Odoo 12,Odoo 13和14版本已经修复了这个bug。

临时解决方案

既然问题根源是Date字段在点击编辑时(未修改值)就重复触发Onchange,我们可以手动在函数里添加值变化判断,模拟Char字段的正常逻辑:

@api.onchange('today_date')
def change_date(self):
    # 获取字段的原始值(通过self._origin拿到未修改前的记录数据)
    original_date = self._origin.today_date
    # 仅当当前值与原始值不同时,才执行校验逻辑
    if self.today_date != original_date:
        if self.today_date == datetime.datetime.today().date():
            raise ValidationError("Selected today's Date >>>>>>>>>>>>>>")

这样就能确保只有当用户真正修改了Date字段的值时,才会执行Onchange里的校验逻辑,避免无意义的错误弹窗反复出现。

内容的提问来源于stack exchange,提问作者Satya Dev Yadav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 11:07:49