Odoo 15:修改JS传入的DateTime字段时间并支持用户后续编辑
解决方案
问题根源
你之前的代码错误地将字段设置为计算字段(compute),且把onchange和compute方法同名混用,导致用户编辑后的值会被计算逻辑强制覆盖,同时计算字段的只读优先级高于states配置,最终无法编辑。
方法一:前端JS直接修正日期格式(推荐)
既然你是从JS传入日期,直接在前端拼接目标时间即可,无需后端额外处理,简单高效:
context: { default_checkin: $(this).attr("date") + " 17:00:00", },
这样传入Odoo的就是带17:00:00的完整DateTime字符串,字段会直接显示正确时间,且保留draft状态的编辑权限。
方法二:后端通过默认值或创建逻辑处理
如果必须在后端处理,不要用compute字段,改用以下两种方式:
方式1:自定义默认值函数
checkin = fields.Datetime( "Expected-Date-Arrival", required=True, readonly=True, states={"draft": [("readonly", False)]}, default=lambda self: self._get_default_checkin() ) def _get_default_checkin(self): # 从上下文获取前端传入的日期值 input_date = self.env.context.get("default_checkin") if input_date: # 拼接目标时间 return f"{input_date} 17:00:00" # 无传入值时的默认值(可根据需求调整) return fields.Datetime.now()
方式2:重写create方法修正值
checkin = fields.Datetime( "Expected-Date-Arrival", required=True, readonly=True, states={"draft": [("readonly", False)]}, ) @api.model def create(self, vals): # 仅当传入checkin值时修正时间部分 if "checkin" in vals and vals["checkin"]: # 拆分出日期部分,拼接目标时间 date_part = vals["checkin"].split(" ")[0] vals["checkin"] = f"{date_part} 17:00:00" return super().create(vals)
以上两种后端方式都不会破坏states的编辑权限配置,用户在draft状态下仍可自由修改时间。
内容的提问来源于stack exchange,提问作者odoo newbie
相关产品推荐
相关产品推荐

