Odoo8中one2many字段选重复产品时即时抛出异常的实现方法
解决Odoo 8销售订单行重复产品即时校验问题
嗨,这个需求我之前在Odoo 8项目里刚好处理过!要实现选完产品立刻触发重复校验,而不是等保存订单才报错,核心是要在销售订单行的product_id字段变更时添加实时校验逻辑,下面给你具体的实现步骤:
1. 继承销售订单行模型,添加实时校验方法
创建一个自定义模块(如果还没有的话),在模块的models文件里继承sale.order.line,并添加onchange校验方法:
from openerp import models, fields, api, exceptions class SaleOrderLine(models.Model): _inherit = 'sale.order.line' @api.onchange('product_id') def onchange_product_id_check_duplicate(self): # 当用户选择/修改产品时触发此方法 if self.product_id and self.order_id: # 过滤当前订单中已存在的相同产品行(排除当前正在编辑的行) duplicate_lines = self.order_id.order_line.filtered( lambda line: line.product_id == self.product_id and line.id != self.id ) if duplicate_lines: # 抛出即时警告,Odoo会直接弹出提示框 raise exceptions.Warning( f"⚠️ 错误:产品「{self.product_id.name}」已经存在于当前订单中,不能重复添加!" )
2. (可选)添加保存时的兜底校验
如果担心用户通过后台导入、批量操作等方式绕过前端的onchange校验,可以再添加一个模型约束,确保保存时也会检查:
@api.one @api.constrains('product_id', 'order_id') def _constrain_duplicate_product(self): if self.product_id and self.order_id: # 统计当前订单中相同产品的行数(排除当前行) duplicate_count = self.order_id.order_line.search_count( [ ('product_id', '=', self.product_id.id), ('order_id', '=', self.order_id.id), ('id', '!=', self.id) ] ) if duplicate_count > 0: raise exceptions.ValidationError("订单中不允许存在重复的产品!")
3. 配置模块依赖并部署
在模块的__openerp__.py文件里声明依赖sale模块,确保模块能正确加载:
{ 'name': 'Sale Order Duplicate Product Validation', 'version': '1.0', 'depends': ['sale'], 'author': 'Your Name', 'data': [], 'installable': True, 'auto_install': False, }
把模块打包部署到Odoo 8实例,安装后测试:当你在销售订单行选择已存在的产品时,会立刻弹出警告弹窗,阻止重复添加,完全不需要等到保存订单!
内容的提问来源于stack exchange,提问作者Maddela Tejaswini4029
相关产品推荐
相关产品推荐

