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

