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

心靈之曲
发布: 2025-11-10 12:15:36
原创
707人浏览过

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属性的混淆以及对搜索视图中字段引用的不当。

  • 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。

纳米搜索
纳米搜索

纳米搜索:360推出的新一代AI搜索引擎

纳米搜索 30
查看详情 纳米搜索
<!-- 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系统添加更多灵活和用户友好的搜索功能。

以上就是Odoo产品变体界面添加产品模板字段搜索功能指南的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号