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

Odoo表单视图中如何将last_update字段默认值设为当前时间?

解决Odoo中last_update字段编辑时自动更新为当前时间的问题

嘿,我来帮你搞定这个问题!你之前用的default_last_update并不是Odoo表单视图字段的合法属性,所以自然不会生效。而且要实现编辑表单时自动更新为当前系统时间,只靠视图层的设置是不够的,得在模型层做处理才行。下面给你两种靠谱的实现方案:

方案一:重写模型的write方法(最可靠)

这种方法会在每次保存编辑后的记录时,自动把last_update字段更新为当前时间,同时保留创建记录时的初始默认值。

首先在你的模型代码里这样定义:

from odoo import models, fields, api

class YourModel(models.Model):
    _name = 'your.model.name'  # 替换成你的实际模型名称
    _description = 'Your Model Description'

    # 定义last_update字段,创建时默认设为当前时间
    last_update = fields.Datetime(
        string='Last Updated',
        default=lambda self: fields.Datetime.now(),
        readonly=True  # 禁止用户手动修改该字段
    )

    # 重写write方法,每次保存时强制更新last_update
    def write(self, vals):
        # 不管用户有没有传该字段的值,都强制设为当前时间
        vals['last_update'] = fields.Datetime.now()
        # 调用父类的write方法完成最终保存操作
        return super(YourModel, self).write(vals)

然后在表单视图里正常引用字段即可,不需要额外属性:

<field name="last_update"/>

方案二:使用API装饰器实现实时更新(适合特定场景)

如果你希望在表单编辑过程中实时更新last_update(比如用户修改任意字段时就同步更新时间),可以结合@api.onchange装饰器。不过注意:这种方法只有在表单中有字段被修改时才会触发,如果用户直接点保存但没改任何内容,可能不会更新时间:

from odoo import models, fields, api

class YourModel(models.Model):
    _name = 'your.model.name'
    _description = 'Your Model Description'

    last_update = fields.Datetime(
        string='Last Updated',
        default=lambda self: fields.Datetime.now(),
        readonly=True
    )

    # 监听模型中所有字段的变化,触发时更新last_update
    @api.onchange('*')
    def _onchange_any_field(self):
        self.last_update = fields.Datetime.now()

为什么你之前的方法无效?

你用的default_last_update并不是Odoo支持的视图字段属性,表单视图里设置默认值应该用default属性,但它只能在创建新记录时生效,无法实现编辑时的自动更新。要完成编辑时的时间更新,必须在模型层通过重写方法或API装饰器来实现。

内容的提问来源于stack exchange,提问作者Mingg Lex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:17:42