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

Odoo中如何使@api.onchange仅执行一次?解决时间重置问题

实现Odoo中Datetime字段首次自动设为14:00且允许后续手动修改

你的问题核心是当前@api.onchange会在每次修改字段时触发重置,导致无法手动调整时间。可以通过添加辅助标记字段来控制仅执行一次初始化逻辑,具体方案如下:

修改代码方案

1. 添加辅助标记字段

在模型中新增一个布尔字段,用于记录是否已完成首次时间初始化:

_checkin_initialized = fields.Boolean(
    string='Checkin初始化标记',
    default=False,
    store=True,
    readonly=True,
)

2. 调整onchange方法逻辑

修改原有的_get_checkin方法,仅在未初始化时执行时间重置:

@api.onchange('checkin')
def _get_checkin(self):
    if self.checkin and not self._checkin_initialized:
        # 仅首次设置时将时间改为14:00:00
        self.checkin = self.checkin.strftime("%Y-%m-%d 14:00:00")
        self._checkin_initialized = True

3. 保留原字段定义

原checkin字段的定义无需修改:

checkin = fields.Datetime(
    "Expected-Date-Arrival",
    required=True,
    readonly=True,
    states={"draft": [("readonly", False)]},
    store=True,
)

方案说明

  • 辅助字段_checkin_initialized默认值为False,仅在首次触发checkin的onchange时(即JS传入随机时间时),执行时间重置操作,并将标记设为True。
  • 后续用户手动修改checkin时间时,由于标记字段已为True,不会再触发重置逻辑,保证手动修改的有效性。
  • 标记字段设置为store=True,确保记录保存后重新加载时,初始化状态依然有效。

内容的提问来源于stack exchange,提问作者odoo newbie

相关产品推荐
方舟 Agent Plan

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

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