Odoo 8销售报价单行项添加EAN13条码搜索功能咨询
实现销售报价单中通过EAN13条码搜索产品的功能
嘿,我来帮你搞定这个EAN13条码搜索的需求!你的思路完全正确——通过重写product.product模型的name_search方法扩展搜索范围,但代码里有几个小细节需要调整,下面是修正后的完整实现:
修正后的代码
# -*- coding: utf-8 -*- from openerp import models, api class ProductProduct(models.Model): _inherit = "product.product" @api.model def name_search(self, name='', args=None, operator='ilike', limit=100): # 先调用原方法,保留默认的名称、内部编号搜索逻辑 res = super(ProductProduct, self).name_search(name=name, args=args, operator=operator, limit=limit) # 仅在支持模糊/精确匹配的操作符下,添加EAN13条码搜索 if operator in ('ilike', 'like', '=', '=like', '=ilike'): # 合并原有搜索条件与EAN13搜索域 domain = [('ean13', operator, name)] if args: domain += args # 搜索匹配EAN13的产品 ean_matched_ids = self.search(domain, limit=limit) # 将匹配结果加入原搜索结果 res += self.name_get(ean_matched_ids) # 去重:避免同一产品因名称和EAN13同时匹配而重复显示 res = list(set(res)) # 按产品名称排序,保持结果整洁 res.sort(key=lambda x: x[1]) return res
关键调整说明
- 规范类定义:把
product_product改为符合PEP8规范的ProductProduct,同时修正models.model为models.Model(大写M是Odoo的正确类名) - 保留原搜索逻辑:调用
super时传递原始参数,确保原有的名称、内部编号搜索功能不受影响 - 合并搜索条件:将原有
args过滤条件与EAN13搜索域结合,避免忽略其他业务场景的过滤规则 - 结果去重处理:通过
set去重,防止同一产品多次出现在搜索结果中 - 适配新API:添加
@api.model装饰器,符合Odoo新API的写法,同时兼容旧版本
使用步骤
- 将这段代码放到你的自定义Odoo模块的
models目录下(比如命名为product_extend.py) - 在模块的
__openerp__.py(或__manifest__.py)中声明对product模块的依赖 - 安装/升级自定义模块后,回到销售报价单的产品搜索框,输入EAN13条码就能直接匹配到对应产品了!
内容的提问来源于stack exchange,提问作者Dalila Hannouche
相关产品推荐
相关产品推荐

