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

Odoo12发票添加自定义日期字段失败:脚本问题排查

问题分析与修复方案

我来帮你排查下这段Odoo 12代码里的问题,这些错误应该就是导致自定义字段x_date_deal无法创建的原因:

1. 未正确引用date对象

你导入了datetime模块,但直接使用date.today()会触发NameError——因为date是datetime模块下的子类,不能直接调用。解决方式二选一:

  • 改成datetime.date.today()来调用
  • 或者调整导入语句,直接导入date:from datetime import date

2. Default值的错误写法

如果直接把date.today()赋值给default,这个日期只会在模块加载时计算一次,之后所有新创建的发票都会用这个固定日期,而不是动态的当前日期。正确的做法是用lambda函数来动态获取当前日期:

default=lambda self: date.today()

3. 约束方法中的逻辑错误

  • record.x_date_deal [0]是完全错误的写法:x_date_deal是Date类型字段,返回的是date对象,不是列表,根本不需要取索引。
  • 逻辑判断完全写反了:你的提示是「交易日期必须早于当前日期」,但原代码里如果日期小于等于今天就抛出错误,这和需求正好相反。另外,不要把日期转成字符串比较,直接用date对象比较更可靠。

修复后的完整代码

from datetime import date
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError

class DealInvoice(models.Model):
    _inherit = 'account.invoice'

    x_date_deal = fields.Date(
        string='Date Deal',
        required=True,
        readonly=True,
        default=lambda self: date.today(),
        index=True,
        states={'draft': [('readonly', False)], 'sent': [('readonly', False)]},
        help='Item date deal.'
    )

    @api.constrains('x_date_deal')
    def _x_date_deal_check(self):
        today = date.today()
        for record in self:
            if record.x_date_deal and record.x_date_deal > today:
                raise ValidationError(_("Date deal must be before current date."))

额外提示

修复后记得在Odoo应用列表里找到你的模块,点击「升级」,这样新字段才会被创建到数据库中。如果还是无法创建,可以查看Odoo的日志,排查是否有其他问题(比如权限冲突、字段名重复等)。

内容的提问来源于stack exchange,提问作者matt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:21:51