新闻中心

Odoo产品变体搜索:如何从产品模板字段添加高级搜索功能

2025-11-10
浏览次数:
返回列表

Odoo产品变体搜索:如何从产品模板字段添加高级搜索功能

本教程详细介绍了如何在odoo中为产品变体(`product.product`)列表视图添加基于产品模板(`product.template`)字段的自定义搜索功能。文章将引导读者通过定义关联字段、修改搜索视图xml,并重点强调使用`filter_domain`而非`domain`属性来正确构建搜索逻辑,从而解决常见的跨模型搜索难题。

在Odoo的开发实践中,经常需要扩展现有模型的功能,例如为产品变体(product.product)添加基于其所属产品模板(product.template)字段的搜索能力。直接在product.product的搜索视图中引用product.template上的字段会遇到问题,因为搜索字段的domain属性处理方式与预期不同。本教程将详细阐述如何正确实现这一功能。

1. 扩展产品模板模型

首先,我们需要在product.template模型中添加一个自定义字段。例如,我们添加一个名为model_number的字符型字段来存储产品型号。

from odoo import fields, models

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

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

这段代码通过继承product.template模型,引入了一个新的必填字符型字段model_number。

2. 在产品变体模型中创建关联字段

为了让product.product模型能够直接访问product.template上的model_number字段,我们需要在product.product模型中定义一个关联字段。这个关联字段将通过product_tmpl_id(product.product到product.template的Many2one字段)来获取model_number。

from odoo import fields, models

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

    model_number_search = fields.Char(
        string='产品型号',
        related='product_tmpl_id.model_number',
        store=True, # 设置store=True可以提高搜索性能,因为它会在数据库中存储该字段的值
        readonly=True # 关联字段通常设置为只读
    )

这里,model_number_search字段通过related属性关联到product_tmpl_id.model_number。store=True的设置非常重要,因为它会使这个关联字段的值实际存储在product.product表中,从而允许数据库对其进行索引和高效搜索。

3. 修改产品变体搜索视图

现在,我们可以在product.product的搜索视图中添加一个字段,用于搜索model_number_search。关键在于使用filter_domain属性而不是domain。

<?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>

在这段XML代码中:

沙之丘企业网站程序3.5 沙之丘企业网站程序3.5

沙之丘企业网站程序是一个以asp.net(C#) 4.0 +access进行开发的企业网站源码。主要功能:1、产品、设备、新闻系统2、留言信息直接发邮件到相关部门3、所有链接都以一级目录显示更好的权重4、其他信息扩展,可以增加如:人事招聘,公司介绍,地图,联系我们等5、带有商品和设备的搜索功能6、模板动态化方便扩展模板7、简体繁体选择显示运行环境:windows 2003或者更高windows服务

沙之丘企业网站程序3.5 0 查看详情 沙之丘企业网站程序3.5
  • 我们通过inherit_id继承了Odoo默认的product.product_search_form_view。
  • xpath表达式用于在现有name字段之后插入我们的自定义搜索字段。
  • 新添加的field名为model_number_search,其string属性定义了在搜索框中显示的标签。
  • 核心改动: filter_domain="[('model_number_search', 'ilike', self)]"。这里使用了filter_domain属性,而不是domain。当用户在搜索框中输入内容时,self会代表用户输入的值,filter_domain会根据这个值构建实际的搜索条件,并应用于product.product模型上的model_number_search字段。

4. filter_domain与domain的区别

理解filter_domain和domain的区别是解决此类问题的关键:

  • domain属性: 主要用于定义字段的可选值范围,或者在视图中对记录集进行静态过滤。当应用于field标签时,它通常限制该字段能显示哪些值,或在关联字段的下拉列表中过滤选项。
  • filter_domain属性: 专为搜索视图中的field标签设计。它的作用是根据用户在搜索框中输入的值,动态地构建一个搜索域(domain),并将其应用到当前模型上。self关键字在filter_domain中代表用户输入的搜索值。

错误的尝试通常是使用domain="[('product_tmpl_id.model_number', 'ilike', self)]"。这会导致错误,因为domain属性在搜索字段中不能直接用于动态构建跨模型的搜索条件,特别是当字段本身不是关系字段时。filter_domain才是处理这种情况的正确机制。

5. 总结与注意事项

通过以上步骤,您已经成功地为Odoo的产品变体列表视图添加了基于产品模板字段的自定义搜索功能。

关键要点回顾:

  1. 扩展product.template: 添加您需要的自定义字段。
  2. 在product.product中创建关联字段: 使用related属性将product.template上的字段映射到product.product上,并设置store=True以优化搜索性能。
  3. 修改搜索视图: 在product.product的搜索视图中添加新的field,并务必使用filter_domain属性来定义搜索逻辑,其中self代表用户输入的值。
  4. 理解filter_domain: 它是专门用于搜索视图字段的动态域构建机制,与普通domain的用途不同。

完成代码修改后,请确保升级您的Odoo模块,以便数据库结构和视图定义能够正确更新。这样,用户就能在产品变体界面通过型号字段进行高效搜索了。

以上就是Odoo产品变体搜索:如何从产品模板字段添加高级搜索功能的详细内容,更多请关注其它相关文章!


# 而不是  # 菲律宾找seo工作  # 网站建设采购公告  # 设计公司公众号推广营销  # 上海SEO学习文案图片  # 网络叶子 网站推广  # 佛山网站建设找资源  # 抚顺全网营销推广报价单  # 博客代发帖seo公司  # 靠谱seo优化招商平台  # 萍乡抖音seo排名推广  # 是一个  # ai  # 无需注册  # 如何用  # 因为它  # 这段  # 离线  # 搜索功能  # 自定义  # 企业网站  # red  # 区别 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 抖音网页版企业服务中心登录入口_抖音网页版企业登录平台  NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰  Python中高效访问嵌套字典与列表中的键值对  Eclipse怎么运行工程_Eclipse工程运行配置说明  Go语言中高效处理x-www-form-urlencoded表单数据  LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别  C++如何实现一个智能指针_手动实现C++ shared_ptr的引用计数功能  Python自定义类排序:解决lambda键值访问TypeError的实践指南  Go语言中JSON数据解码与字段访问指南  抖音未来赚钱的新趋势 2025年值得关注的变现风口分析  Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】  163邮箱官方主页登录 直达网易邮箱登录核心页面  在Qt QML中通过Python字典动态更新TextEdit内容的教程  QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网  Lar*el递归关系中排除子孙节点的策略  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  如何在低配置电脑上搭建轻量级J*a环境_占用更小的环境选择技巧  mc.js免安装版 mc.js一键畅玩入口  机器学习中对数变换预测结果的反向还原  在命令行怎么运行html项目_命令行运行html项目方法【教程】  抖音创作助手登录入口_抖音创作辅助工具官网直达  响应式容器内容自动缩放与宽高比维持教程  Sublime Text怎么显示空格和制表符_Sublime显示不可见字符设置  AO3最新官网入口公告_2025AO3镜像站实时查询方法  黑鲨3Pro怎样在相册开漫画风滤镜_iPhone黑鲨3Pro相册开漫画风滤镜【趣味滤镜】  Lar*el的路由模型绑定怎么用_Lar*el Route Model Binding简化控制器逻辑  C#使用XPath查询节点时出错? 常见语法错误与调试技巧  理解J*aScript Promise的微任务队列与执行顺序  mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析  最新韩小圈网页版登录入口_官网在线观看官方链接  Windows10怎么开启夜间模式 Windows10系统设置调整色温与亮度缓解夜间用眼疲劳【教程】  深入理解J*a链表中的IPosition接口与使用  Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略  steam官方网页快速访问 steam账号注册全流程  快速CSGO开箱网站指南 CSGO开箱平台推荐  小红书商家版怎样在笔记嵌入商品卡路径_小红书商家版在笔记嵌入商品卡路径【挂载教程】  包子漫画官方网站阅读入口-包子漫画在线漫画官网直达链接  Angular中父组件异步更新子组件复选框状态的实践指南  微信商城在哪里打开【步骤】  抖音网页版快捷访问 抖音网页版网页版入口操作教程  谷歌学术网站直达地址 谷歌学术搜索网页版一键进入  Golang如何实现简单的Web表单_Golang表单提交与验证处理方法  CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠  谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作  基于动态规划的房屋花卉种植最小成本算法详解  蛙漫画网页版全站入口 蛙漫热门作品免费浏览  sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置  葱吃多了会怎样 葱吃多了会伤胃吗  C++指针和引用有什么区别_C++内存管理核心概念深度解析  css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异 

搜索