讲师中心 微信公众号
AI工具推荐 视频效率加速

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

陌敏同学_3739

陌敏同学_3739

发布时间:2025-11-10 12:15:36

|

788人浏览过

|

来源于php中文网

原创

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属性来定义搜索逻辑,如下所示:

<!-- your_module/views/product_product_views.xml -->
<record id="product_product_search_form_view_inherit" model="ir.ui.view">
    <field name="name">product.product.search.form.view.inherit</field>
    <field name="model">product.product</field>
    <field name="inherit_id" ref="product.product_search_form_view"/>
    <field name="arch" type="xml">
        <xpath expr="//field[@name='name']" position="after">
           <!-- 错误示例:使用 domain 属性 -->
           <field name="model_number_search" string="型号"
                   domain="[('product_tmpl_id.model_number', 'ilike', self)]"/>
        </xpath>
    </field>
</record>

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

理解错误原因:

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

Claw Code Suite (Python-Only Edition)
Claw Code Suite (Python-Only Edition)

仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...

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

正确实现:使用 filter_domain

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

<!-- your_module/views/product_product_views.xml -->
<record id="product_product_search_form_view_inherit" model="ir.ui.view">
    <field name="name">product.product.search.form.view.inherit</field>
    <field name="model">product.product</field>
    <field name="inherit_id" ref="product.product_search_form_view"/>
    <field name="arch" type="xml">
        <xpath expr="//field[@name='name']" position="after">
           <!-- 正确示例:使用 filter_domain 属性 -->
           <field name="model_number_search" string="型号"
                   filter_domain="[('model_number_search', 'ilike', self)]"/>
        </xpath>
    </field>
</record>

在这个修正后的代码中:

  • 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

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <record id="product_product_search_form_view_inherit" model="ir.ui.view">
        <field name="name">product.product.search.form.view.inherit</field>
        <field name="model">product.product</field>
        <field name="inherit_id" ref="product.product_search_form_view"/>
        <field name="arch" type="xml">
            <xpath expr="//field[@name='name']" position="after">
               <field name="model_number_search" string="型号"
                       filter_domain="[('model_number_search', 'ilike', self)]"/>
            </xpath>
        </field>
    </record>
</odoo>

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系统添加更多灵活和用户友好的搜索功能。

热门AI工具

更多
Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

4504

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

5837

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

2442

2024.11.28

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

4504

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

5837

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

2442

2024.11.28

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

2685

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

3921

2023.08.14

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

20

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn