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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 18:31:17