Odoo 10发票付款日期选择器禁用过往日期失效问题求助
Odoo 10: 付款环节禁用过往日期功能失效的解决方案
首先看你的代码,我发现几个核心问题导致功能无法正常生效,咱们一步步来修正:
1. 逻辑判断与需求完全不符
你说要禁用过往日期(也就是不允许选择今天之前的日期),但当前代码里的判断逻辑是:
if datetime.strptime(payment_date, DEFAULT_SERVER_DATE_FORMAT).date() > datetime.now().date(): return False
这其实是在禁止未来日期(付款日期不能晚于今天),完全和你的需求背道而驰!如果要禁用过往日期,应该判断付款日期是否小于当前日期。
2. onchange方法的返回值不符合Odoo规范
在Odoo的旧API(你用的cr, uid, ids这种写法)中,onchange方法不能直接返回False或者日期字符串,必须返回标准的字典格式:
- 要提示用户错误,返回包含
warning键的字典 - 要修改字段值,返回包含
value键的字典
修正后的代码
下面是适配你需求(禁用过往日期,只能选今天及以后的日期)的修正代码,我改用Odoo 10原生支持的新API写法(更简洁规范):
from odoo import models, fields, api from datetime import date from odoo.tools import DEFAULT_SERVER_DATE_FORMAT class AccountPayment(models.Model): _inherit = 'account.payment' @api.onchange('payment_date') def onchange_payment_date(self): if self.payment_date: payment_date = fields.Date.from_string(self.payment_date) today = date.today() if payment_date < today: # 清空付款日期并弹出警告提示 self.payment_date = False return { 'warning': { 'title': "日期选择错误", 'message': "不能选择过往日期,请选择今天或未来的日期!" } }
额外说明
- 新API的
@api.onchange('payment_date')装饰器会自动监听字段变化,不需要手动处理cr, uid等底层参数 - 用
fields.Date.from_string()解析日期字符串,比直接用datetime.strptime()更贴合Odoo的开发规范 - 如果你的实际需求是禁止未来日期(和描述相反),只需要把判断条件改成
payment_date > today即可
这样修改后,当用户选择今天之前的日期时,系统会自动清空日期并弹出警告,完美实现禁用过往日期的效果。
内容的提问来源于stack exchange,提问作者user3606682
相关产品推荐
相关产品推荐

