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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:35:17