当前位置:首页 > 文章列表 > 文章 > 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推荐
  • ljg-skills -
    ljg-skills
    ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
    2209次使用
  • MELO音乐 - AI 音乐生成平台,支持多模态创作能力
    MELO音乐
    MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
    2019次使用
  • UniScribe - AI 免费在线音视频转文字平台
    UniScribe
    UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
    1972次使用
  • 剧云 - 免费 AI 智能中文剧本创作平台
    剧云
    剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
    2186次使用
  • 万象有声 - AI 一站式有声内容创作平台
    万象有声
    万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
    2148次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码