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
相关产品推荐
相关产品推荐

