Odoo 11 Survey模块:如何将Answers中的Deadline datetime字段默认时间设置为23:59
解决Odoo 11 Survey模块Answer截止时间默认23:59的问题
我来帮你搞定这个截止时间的问题!你之前的代码没生效,核心原因是Odoo的Datetime字段需要完整的「日期+时间」格式字符串,而你只返回了时间部分,Odoo无法正确解析,所以会 fallback 到默认的时区相关时间(比如你看到的5:30,大概率是服务器时区的默认偏移)。
下面给你两种场景的解决方案,对应你的需求:
场景1:让Answer的截止时间默认是「当前日期的23:59:59」
直接修改字段的default值,用Python的datetime模块生成完整的日期时间:
from datetime import datetime from odoo import fields, models class SurveyUserInput(models.Model): _inherit = 'survey.user_input' # 对应Answers模块的核心模型 deadline = fields.Datetime( 'Deadline', help="Date by which the person can open the survey and submit answers", oldname="date_deadline", default=lambda self: datetime.now().replace(hour=23, minute=59, second=59) )
这个写法会获取当前系统日期,然后把时间部分替换为23:59:59,生成完整的datetime字符串,Odoo就能正确识别了。
场景2:从Survey向导的日期字段传递截止日期,自动补23:59:59
如果你的流程是:用户在向导里选择一个日期,然后Answer的截止时间自动设为该日期的23:59,那需要在向导的创建逻辑里处理:
from odoo import models, fields class SurveyWizard(models.TransientModel): _name = 'survey.wizard' # 你的Survey向导模型 deadline_date = fields.Date('Deadline Date') # 向导里的日期字段 survey_id = fields.Many2one('survey.survey', string='Survey') def action_create_survey_answer(self): self.ensure_one() # 拼接日期和目标时间 deadline_datetime = f"{self.deadline_date} 23:59:59" if self.deadline_date else None # 创建Answer记录 self.env['survey.user_input'].create({ 'survey_id': self.survey_id.id, 'deadline': deadline_datetime, # 其他必填字段... })
这样用户在向导选的日期,会自动加上23:59的时间,完美匹配你的需求。
额外提示
- 如果你遇到时区问题(比如显示的时间和预期有偏移),可以改用Odoo内置的
fields.Datetime.now()来获取带时区的时间,再替换小时分钟:default=lambda self: fields.Datetime.now().replace(hour=23, minute=59, second=59) - 确保你继承的模型是正确的:Odoo 11的Survey Answer对应的模型确实是
survey.user_input,别搞错啦!
内容的提问来源于stack exchange,提问作者Pawan Kumar Sharma
相关产品推荐
相关产品推荐

