Odoo 11中设置Datetime字段默认时间时遇TypeError错误的求助
解决Odoo Create函数中设置默认时间时的TypeError问题
我来帮你搞定这个报错,你遇到的TypeError: replace() takes no keyword arguments其实有两个核心原因:
错误根源
- 类型不匹配:
values['deadline']并不是Python的datetime对象,而是字符串类型。字符串的replace()方法是用来替换子串的(比如把"2024"换成"2025"),根本不接受hour、minute这类关键字参数,这就是报错的直接原因。 - 未赋值回结果:就算
deadline是datetime对象,replace()方法也不会修改原对象,而是返回一个新的datetime实例,你必须把这个新值重新赋值给values['deadline']才会生效。
修正后的代码
用Odoo官方推荐的日期时间处理工具来修改你的代码,这样能完美兼容Odoo的字段逻辑:
from odoo import api, models, fields class SurveyUserInputInherit(models.Model): _inherit = 'survey.user_input' @api.model def create(self, values): if 'deadline' in values: # 把Odoo传入的日期字符串转为datetime对象 deadline_dt = fields.Datetime.from_string(values['deadline']) # 修改时间部分,再转回字符串赋值回values values['deadline'] = fields.Datetime.to_string( deadline_dt.replace(hour=23, minute=59, second=59, microsecond=999999) ) line = super(SurveyUserInputInherit, self).create(values) return line
关键细节说明
- 使用Odoo的日期工具:
fields.Datetime.from_string()和to_string()是Odoo专门用来处理日期字段的工具,能自动适配Odoo内部的日期格式,比直接用Python的datetime.strptime()更稳妥。 - 必须重新赋值:因为
replace()返回新对象,原deadline_dt不会被改变,所以一定要把处理后的结果赋值回values['deadline'],不然修改不会生效。 - 字段类型检查:确保你模型里的
deadline字段是datetime类型(不是date类型),不然设置小时、分钟这些参数没有意义。
内容的提问来源于stack exchange,提问作者Pawan Kumar Sharma
相关产品推荐
相关产品推荐

