新闻中心
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属性:专为搜索视图中的
标签设计,用于动态生成搜索条件。当用户在搜索框中输入值时,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。
绿色健美瑜伽美容类网站模板(带手机端)1.4.2
绿色健美瑜伽美容类网站模板(带手机端)自带人人站内核安装即用,支持手机端,图片和文字均已完成可视化,支持伪惊天,多种内容模型可按需求添加。模板特点: 1、安装即用,自带人人站CMS内核及企业站展示功能(产品,新闻,案例展示等),并可根据需要增加表单 搜索等功能(自带模板) 2、支持手机端 3、前端banner轮播图文本均已进行可视化配置 4、伪静态页面生成 5、支持内容模型、多语言、自定义表单、筛
0
查看详情
<!-- 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产品变体界面添加产品模板字段搜索功能指南的详细内容,更多请关注其它相关文章!
# 您将
# 网站建设牛逼业务
# 网站推广书籍
# 沈阳大型网站建设企业
# 白山网站关键词优化怎么提高
# 定远县seo优化
# 老年网站建设美丽文案
# 家装营销推广方案模板
# 广东seo排名推广平台
# 龙华网站建设方案的特点
# 云城区推广全网营销案例
# 即用
# 表单
# python
# 并在
# 在这个
# 自带
# 是一个
# 您的
# 搜索功能
# 自定义
# red
# 区别
# ai
# app
# go
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
jQuery Mask 插件中实现电话号码固定前导零的教程
支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样
小米汽车11月交付量突破40000台!雷军:将继续努力
MAC怎么让Dock栏只显示当前运行的应用_MAC终端命令实现极简Dock栏
Windows10怎么开启夜间模式 Windows10系统设置调整色温与亮度缓解夜间用眼疲劳【教程】
qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决
yandex入口引擎手机版 yandex安卓版下载入口
mc.js官网登录入口 mc.js官方登录入口最新版
J*aScript数组对象转换:按指定键分组与值收集
Angular中单选按钮的正确使用与常见陷阱解析
Win11网速慢怎么解决 Win11网络设置优化解除限速
Golang并发任务中错误如何聚合_Golang goroutine error收集方式
微信网页版登录教程_微信网页版登录入口在哪
腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址
蛙漫正版漫画平台入口_蛙漫免费阅读全站漫画资源
黑鲨3Pro怎样在相册开漫画风滤镜_iPhone黑鲨3Pro相册开漫画风滤镜【趣味滤镜】
海量存储:机器视觉智能化的核心基石
俄罗斯方块最新版入口 俄罗斯方块在线玩官网入口
使用J*aScript检测输入元素是否包含在特定类中
mcjs网页版流畅运行 mcjs低配电脑畅玩入口
微信商城在哪里打开【步骤】
Win11怎么查看电脑配置_Win11硬件配置检测工具使用
纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析
深入理解rpy2中的类型转换:优化Python对象到R矩阵的映射
Linux如何构建多环境配置管理_Linux多环境配置方案
苹果手机指南针不准怎么校准 传感器校准方法详解【建议收藏】
CSS图片焦点样式实现教程:理解与应用tabindex属性
天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】
qq音乐在线播放入口_qq音乐电脑版登录链接
ArchiveofOurOwn小说阅读-ArchiveofOurOwn同人作品访问链接
Win11怎么设置鼠标主按键_Win11鼠标左右键功能互换
大象笔记网页版入口 印象笔记网页版登录入口
12306选座怎么选到商务座_12306商务座选择与配置说明
汽水音乐在线解析 汽水音乐在线解析入口
向日葵客户端怎么进行远程CentOS控制_向日葵客户端远程CentOS控制操作教程
Win11怎么设置开机NumLock亮 Win11修改注册表InitialKeyboardIndicators值
qq游戏免费畅玩入口_qq游戏电脑版快速启动
单12V-2×6实现为RTX 5090供电750W!甚至都没敢跑分
Golang切片为何属于引用类型_Golang slice底层结构与引用语义说明
Pandas DataFrame 高效批量赋值:告别循环与笛卡尔积误区
Python自定义类排序:解决lambda键值访问TypeError的实践指南
12306怎么选座位选到安静区_12306选座安静区域选择策略
必由学在线入口 必由学网页版快速登录入口
解决Tabulator日期时间排序问题的专业指南
怎样在Excel中做仪表盘_Excel仪表盘设计与关键指标展示方法
随机参数递归函数的基准调用次数与时间复杂度探究
在Socket.IO连接中实现Access Token自动更新与动态重连
Odoo 16:在表单视图中基于当前记录动态修改Tree视图属性
win11怎么查看应用耗电情况 Win11电池设置查看应用能耗排行榜【优化】
TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法


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