新闻中心
Odoo中为产品变体界面添加产品模板字段搜索功能指南

本教程详细指导如何在odoo的产品变体(`product.product`)列表中,通过关联字段实现对产品模板(`product.template`)上自定义字段的搜索功能。文章将涵盖自定义字段定义、关联字段创建,并重点解析在搜索视图中使用`filter_domain`而非`domain`的关键区别,解决常见错误,确保搜索功能正确生效。
在Odoo的实际应用中,我们经常需要在产品变体(product.product)的列表或搜索界面中,根据产品模板(product.template)上的特定字段进行筛选。由于product.product是product.template的子模型,直接在product.product的搜索视图中引用product.template的字段需要特定的处理方式。本教程将详细讲解如何实现这一功能,并纠正常见的错误用法。
1. 在产品模板中定义自定义字段
首先,我们需要在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, help="产品的型号或SKU")在上述代码中,我们通过继承product.template模型,添加了一个名为model_number的字符型字段,用于存储产品的型号信息。
2. 在产品变体模型中创建关联字段
为了让product.product模型能够直接访问product.template上的model_number字段,我们需要在product.product模型上创建一个关联(related)字段。这个关联字段将作为在product.product搜索视图中引用的桥梁。
# 文件: 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, # 设置为True,以便在数据库中存储,提高搜索性能
help="产品模板的型号,用于在产品变体界面进行搜索"
)字段属性说明:
- related='product_tmpl_id.model_number':这是核心部分,它将此字段关联到当前产品变体所对应的产品模板的model_number字段。
- readonly=True:由于这是一个关联字段,其值由product.template上的源字段决定,因此通常设置为只读。
- store=True:将此字段的值存储在product.product表的数据库中。虽然不是强制性的,但对于频繁进行搜索的字段,将其存储可以显著提高搜索性能,避免每次查询都进行跨表连接。
3. 修改产品变体搜索视图
现在我们已经准备好了自定义字段和关联字段,下一步是在product.product的搜索视图中添加一个搜索框。这一步是整个实现过程中最容易出错的地方,尤其是在domain和filter_domain的选择上。
正确的XML代码示例如下:
Yaara
使用AI生成一流的文案广告,电子邮件,网站,列表,博客,故事和更多…
95
查看详情
<!-- 文件: your_module/views/product_product_views.xml -->
<odoo>
<data>
<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>
</data>
</odoo>关键点:filter_domain与domain的区别
这是解决原始问题并确保搜索功能正常工作
的核心。
domain属性: 当你在
标签中使用domain属性时,Odoo期望这个域表达式能够直接应用于当前字段或其直接关联。例如,如果model_number_search是一个存储在product.product模型上的常规字段,那么domain="[('model_number_search', 'ilike', self)]"是有效的。然而,当你尝试使用类似domain="[('product_tmpl_id.model_number', 'ilike', self)]"这样的表达式时,Odoo会报错,因为它认为你正在一个非关系字段(model_number_search本身)上应用一个涉及多级关联的域。self在这里代表用户在搜索框中输入的字符串。 -
filter_domain属性:filter_domain是专门为这种场景设计的。它允许你定义一个独立的域表达式,该表达式将应用于当前模型的记录集,并且可以使用搜索字段的输入值(self)作为条件。
- 当用户在model_number_search字段对应的搜索框中输入文本时,self变量将包含该文本。
- filter_domain="[('model_number_search', 'ilike', self)]"告诉Odoo,将用户输入的值(self)用于筛选product.product模型上的model_number_search字段,查找包含该值的记录。
- 由于model_number_search字段已经通过related属性关联到了product.template的model_number,因此这个筛选最终会作用于产品模板的型号。
简而言之,domain通常用于字段的静态筛选或依赖于其他字段的简单筛选,而filter_domain则用于构建动态的、更复杂的搜索条件,特别是当搜索字段本身并不直接对应数据库列,或者需要根据用户输入构建跨字段的查询时。
4. 部署与测试
完成上述代码修改后,你需要:
- 将你的Odoo模块添加到Odoo的插件路径中。
- 通过Odoo的应用程序界面(“Apps”菜单)升级你的模块。
- 导航到“销售” -> “产品” -> “产品变体”列表视图。
- 在搜索栏中,你应该能看到新添加的“型号”搜索框。输入型号信息进行测试,确认搜索功能是否正常。
总结
通过本教程,我们学习了如何在Odoo的产品变体界面中,为产品模板上的自定义字段添加搜索功能。关键步骤包括:在product.template上定义自定义字段,在product.product上创建指向该字段的关联字段,以及最重要的是,在搜索视图中正确使用filter_domain属性来构建搜索条件。理解domain和filter_domain之间的区别,是解决此类Odoo开发问题的关键。正确运用filter_domain不仅能避免错误,还能提供灵活且高效的搜索体验。
以上就是Odoo中为产品变体界面添加产品模板字段搜索功能指南的详细内容,更多请关注其它相关文章!
# 数据库中
# 成都网络营销推广培训
# 低成本网站推广哪里好
# 郴州网站建设集团招聘
# 营销公共推广的特点
# 临沧百度seo排名
# 潍坊高端网站维护推广
# 湖州seo优化价格贵吗
# 天津劫持关键词排名
# 咨询官网网站搭建推广方案
# 营销网络推广策划
# 如何用
# app
# 设置为
# 将此
# 应用于
# 中为
# 是在
# 这是
# 搜索功能
# 自定义
# red
# 区别
# ai
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】
4399体育竞技小游戏_4399小游戏赛事入口
AO3最新官网入口公告_2025AO3镜像站实时查询方法
CSS Box Model与弹性按钮:维持布局稳定的动画实践
ExcelARRAYTOTEXT函数怎么自定义分隔符输出数组文本_ARRAYTOTEXT实现动态生成SQL语句
知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法
抖音DOU+怎么投最有效 抖音付费推广的ROI提升技巧
使用 Pandas 高效处理 .dat 文件:字符清理与数据计算
Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践
C++如何实现线程池_C++11手动实现一个简单的固定大小线程池
win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】
动漫花园资源网使用步骤_动漫花园资源网下载流程
学习通网页版官方登录 超星学习通电脑端入口指南
Odoo 16:在表单视图中基于当前记录动态修改Tree视图属性
百度网盘网页版入口 百度网盘网页版官方登录网址
电脑屏幕颜色不舒服怎么办_Windows夜间模式与色彩校准教程【护眼技巧】
Golang如何实现Web接口签名验证_Golang Web接口签名校验开发方法
LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别
蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址
QQ邮箱登录首页官网地址2026 QQ邮箱官方网页入口
c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架
实现分段式页面滚动导航:CSS与J*aScript教程
Win10如何恢复误删的快捷方式_Win10重建常用软件快捷方式
Python异步编程实践:使用Binance API构建实时交易数据流
快手官方唯一登录入口 谨防山寨钓鱼网站
Django表单提交验证失败后保持字段值不刷新
优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法
C++如何生成随机数_C++ random库使用方法与范围设置
J*aScript数组对象转换:按指定键分组与值收集
天猫2025双十一0点秒杀攻略 天猫爆款抢购时间
Python:递归比较文件夹内容并找出特定类型文件的差异
excel怎么制作工资条 excel快速生成工资条的方法
poki免费入口快捷访问 poki人气小游戏直接玩站点
Flexbox布局实践:实现粘性导航栏与底部固定页脚
邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧
海量存储:机器视觉智能化的核心基石
Go语言HTML解析:利用Goquery精准获取指定元素内容
Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】
在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南
Windows 11怎么彻底关闭定位_Windows 11服务中禁用Geolocation
Python实现多节点属性重叠度分析教程
深入理解字体排版:Adobe光学字偶距与CSS字偶距的差异与实现
在Go Martini框架中高效服务动态生成图像的实践指南
12306选座系统怎么选连座_12306选座多人连坐操作方法
内存检查:在VS Code中调试C++时的内存视图
C++如何比较两个字符串_C++ string compare函数与操作符对比
德邦快递查询平台 德邦快递物流信息查询入口
Golang如何通过reflect操作map_Golang reflect map操作与遍历技巧
优化大型XML文件解析:基于Python流式处理的内存高效方案
迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法


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