当前位置:首页 > 文章列表 > 文章 > python教程 > Odoo变体界面添加字段搜索方法

Odoo变体界面添加字段搜索方法

2025-11-17 12:54:33 0浏览 收藏

本文详细介绍了如何在Odoo产品变体(`product.product`)列表中,通过添加基于产品模板(`product.template`)自定义字段的搜索功能,提升系统可用性。针对Odoo实际应用中常见的需求,即在产品变体界面通过产品模板字段进行搜索,本文阐述了如何定义关联字段,并强调了`filter_domain`属性的正确使用,以避免常见的配置错误。同时,文章强调了`store=True`对于搜索性能的重要性,并通过完整代码示例,指导开发者完成从自定义字段定义到搜索视图配置的整个流程,助力Odoo用户构建更高效、用户友好的搜索功能。

Odoo产品变体界面添加产品模板字段搜索功能指南

本教程详细阐述了如何在Odoo产品变体(`product.product`)列表中添加一个基于产品模板(`product.template`)自定义字段的搜索功能。通过定义关联字段并正确使用`filter_domain`属性,我们解决了常见的搜索视图配置错误,确保用户能够高效地根据模板层面的信息筛选产品变体,提升系统可用性。

引言:在Odoo产品变体中实现模板字段搜索

在Odoo的实际应用中,我们经常需要在产品变体(product.product)的列表视图中,根据产品模板(product.template)上定义的字段进行搜索。例如,如果产品模板上有一个自定义的“型号”(model_number)字段,我们可能希望在产品变体界面直接通过型号来查找对应的变体。本教程将引导您完成这一功能的实现,并纠正一个常见的配置错误。

步骤一:在产品模板中定义自定义字段

首先,我们需要在product.template模型中添加一个自定义字段。这个字段将存储我们希望在产品变体界面进行搜索的信息。

# your_module/models/product_template.py
from odoo import fields, models

class ProductTemplate(models.Model):
    _inherit = 'product.template'

    model_number = fields.Char(string='型号', required=True)

在这个例子中,我们添加了一个名为model_number的字符型字段,用于存储产品的型号。

步骤二:在产品变体模型中创建关联字段

由于model_number字段定义在product.template上,而我们希望在product.product的搜索视图中进行搜索,因此我们需要在product.product模型上创建一个关联字段,将其链接到product_tmpl_id上的model_number。

# your_module/models/product_product.py
from odoo import fields, models

class ProductProduct(models.Model):
    _inherit = 'product.product'

    # 关联到产品模板的model_number字段
    model_number_search = fields.Char(related='product_tmpl_id.model_number',
                                      string='型号',
                                      readonly=True,
                                      store=True) # 建议设置为True以提高搜索性能

这里,model_number_search是一个related字段,它会自动从关联的产品模板中获取model_number的值。readonly=True表示该字段不可编辑,store=True则非常重要,它会将关联字段的值存储在product.product的数据库表中,从而允许对该字段进行索引,显著提高搜索查询的性能。

步骤三:配置产品变体搜索视图

接下来,我们需要修改product.product的搜索视图,添加一个用于搜索model_number_search字段的输入框。

初始尝试及常见错误:

许多开发者可能会尝试使用domain属性来定义搜索逻辑,如下所示:



    product.product.search.form.view.inherit
    product.product
    
    
        
           
           
        
    

这段代码会引发一个错误:Domain on non-relational field "model_number_search" makes no sense (domain:[('product_tmpl_id.model_number', 'ilike', self)])。

理解错误原因:

这个错误的核心在于对domain和filter_domain属性的混淆以及对搜索视图中字段引用的不当。

  • domain属性:主要用于定义字段的默认过滤条件,或者限制关联字段(如Many2one)的可选值范围。它通常在字段定义或视图定义中用于设置固定的或基于上下文的初始筛选。
  • filter_domain属性:专为搜索视图中的标签设计,用于动态生成搜索条件。当用户在搜索框中输入值时,filter_domain会根据用户输入(通过self关键字引用)来构建一个筛选域,并将其应用到当前视图的数据集上。
  • 在搜索视图中,当您使用一个作为搜索输入框时,其filter_domain应该引用该所对应的模型上的字段。即使model_number_search是一个related字段,它也已经成为了product.product模型的一部分。因此,在filter_domain中直接引用model_number_search是正确的做法。

正确实现:使用 filter_domain

要正确实现搜索功能,我们需要将domain属性替换为filter_domain,并且在filter_domain中直接引用product.product模型上的关联字段model_number_search。



    product.product.search.form.view.inherit
    product.product
    
    
        
           
           
        
    

在这个修正后的代码中:

  • filter_domain属性被用于定义搜索逻辑。
  • [('model_number_search', 'ilike', self)]表示当用户在搜索框中输入内容时,Odoo会构建一个搜索条件,查找model_number_search字段的值包含(ilike)用户输入(self)的所有产品变体。

完整代码示例

为了清晰起见,以下是所有相关代码的完整整合:

1. your_module/models/product_template.py

from odoo import fields, models

class ProductTemplate(models.Model):
    _inherit = 'product.template'

    model_number = fields.Char(string='型号', required=True)

2. your_module/models/product_product.py

from odoo import fields, models

class ProductProduct(models.Model):
    _inherit = 'product.product'

    model_number_search = fields.Char(related='product_tmpl_id.model_number',
                                      string='型号',
                                      readonly=True,
                                      store=True)

3. your_module/views/product_product_views.xml



    
        product.product.search.form.view.inherit
        product.product
        
        
            
               
            
        
    

4. your_module/__init__.py

from . import models

5. your_module/__manifest__.py

确保在depends中包含product模块,并在data中包含XML视图文件。

{
    'name': 'Custom Product Search',
    'version': '1.0',
    'category': 'Sales',
    'summary': 'Adds custom search field to product variants',
    'depends': ['product'],
    'data': [
        'views/product_product_views.xml',
    ],
    'installable': True,
    'application': False,
    'auto_install': False,
}

完成上述代码的添加和模块的升级后,您将在产品变体列表的搜索栏中看到一个新的“型号”搜索字段,并且可以根据产品模板上的型号信息进行有效搜索。

注意事项与最佳实践

  • store=True的重要性:对于用于搜索的related字段,强烈建议设置store=True。这会将关联数据物理地存储在当前模型的数据库表中,允许Odoo对该字段进行索引,从而显著提高搜索操作的速度和效率。如果store为False,每次搜索都需要进行复杂的关联查询,性能会大打折扣。
  • filter_domain与domain的区别:牢记这两个属性在Odoo视图定义中的不同用途。filter_domain用于搜索视图中的动态过滤,而domain用于固定过滤条件或字段选择范围。
  • 字段命名约定:为了代码的可读性和维护性,为关联字段选择一个清晰、表达其用途的名称(例如model_number_search)。
  • 模块依赖:确保您的自定义模块正确声明了对product模块的依赖,以便Odoo能够正确加载和继承基础模型和视图。
  • 升级模块:每次修改Python或XML文件后,务必通过Odoo的应用程序界面升级您的模块,以使更改生效。

总结

通过本教程,我们学习了如何在Odoo产品变体界面中,为产品模板上的自定义字段添加有效的搜索功能。关键在于在产品变体模型中创建store=True的关联字段,并在搜索视图中使用filter_domain属性来定义搜索逻辑。理解filter_domain与domain的区别,是避免常见错误并构建高效Odoo自定义功能的关键。遵循这些步骤和最佳实践,您将能够为您的Odoo系统添加更多灵活和用户友好的搜索功能。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《Odoo变体界面添加字段搜索方法》文章吧,也可关注golang学习网公众号了解相关技术文章。

12306App下载安装教程详解12306App下载安装教程详解
上一篇
12306App下载安装教程详解
Excel批量生成带序列号的条形码教程
下一篇
Excel批量生成带序列号的条形码教程
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    277次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    331次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    325次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    295次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    115次使用