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
相关产品推荐
相关产品推荐

