实践环境

Odoo 14.0-20221212 (Community Edition)

需求描述

如下图,列表网仓记录详情页面(form视图),编辑内联视图中的货主记录,为货主仓库字段搜索,添加过滤条件,具体如下:

  • 添加、编辑货主时,下拉列表中只展示选取和当网仓记录所属公司关联的货主,点击搜索更多,仅展示和当前网仓记录所属公司关联的货主
  • 添加、编辑货主时,下拉列表中只展示选取和当网仓记录关联的仓库(到 “仓库” Tab页中添加的仓库),点击搜索更多,仅展示和当前网仓记录关联的仓库。

模型设计

说明:为了更好的体现本文主题,部分非关键代码已省略,即做了适当的模型简化处理

# 网仓
class OmsNetwork(models.Model):
_name = 'oms.network'
_description = 'OMS Network' company_id = fields.Many2one('res.company', '公司', index=True, tracking=3, readonly=True, default=lambda self: self.env.company)
warehouse_ids = fields.Many2many('stock.warehouse', string="仓库")
line_ids = fields.One2many('oms.network.line', 'network_id', string='货主') # 货主
class OmsNetworkLine(models.Model):
_name = 'oms.network.line'
_description = 'OMS Network Line' network_id = fields.Many2one('oms.network', string='仓网', required=True)
partner_id = fields.Many2one('res.partner', string='货主', required=True)
warehouse_id = fields.Many2one('stock.warehouse', string="仓库", required=True)
company_id = fields.Many2one('res.company', '公司', store=True, related='network_id.company_id') class ResPartner(models.Model):
_inherit = ['res.partner']
_name = 'res.partner' #...略
def _get_default_company_id(self):
if self.env.context.get('set_default_company', False):
return self.env.company
return False company_id = fields.Many2one( # 注意,这个字段和OmsNetwork.company_id关联了相同模型,所以下文可用这个字段进行搜索过滤
'res.company', 'Company', index=True,
check_company=False, tracking=3,
default=lambda self: self._get_default_company_id()) # 仓库
class StockWarehouse(models.Model):
_inherit = 'stock.warehouse' # ...略
# 注:没有类似ResPartner的company_id字段

视图设计

<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<data>
<!--此处代码已省略-->
<record id="view_oms_network_form" model="ir.ui.view">
<field name="name">oms.network.form</field>
<field name="model">oms.network</field>
<field name="priority" eval="0"/>
<field name="arch" type="xml">
<form string="OMS Network">
<!--此处代码已省略-->
<sheet>
<group>
<group>
<!--此处代码已省略-->
</group>
<group>
<field name="company_id"/>
</group>
</group>
<notebook>
<page string="货主" name="line_ids" >
<field name="line_ids">
<tree editable="bottom">
<field name="partner_id"/>
<field name="partner_code"/>
<field name="warehouse_id"/>
<!--此处代码已省略-->
</tree>
</field>
</page>
<!--此处代码已省略-->
</notebook>
</sheet>
<!--此处代码已省略-->
</form>
</field>
</record>
<!--此处代码已省略-->
</data>
</odoo>

添加过滤条件代码实现

修改视图,给视图添加context

<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<data>
<!--此处代码已省略-->
<record id="view_oms_network_form" model="ir.ui.view">
<field name="name">oms.network.form</field>
<field name="model">oms.network</field>
<field name="priority" eval="0"/>
<field name="arch" type="xml">
<form string="OMS Network">
<!--此处代码已省略-->
<sheet>
<group>
<group>
<!--此处代码已省略-->
</group>
<group>
<field name="company_id"/>
</group>
</group>
<notebook>
<page string="货主" name="line_ids" >
<field name="line_ids" context="{'oms_network_id':active_id, 'oms_network_company_id': company_id}">
<tree editable="bottom">
<field name="partner_id" context="{'oms_network_company_id':context.get('oms_network_company_id')}"/>
<field name="partner_code"/>
<field name="warehouse_id" context="{'oms_network_id':context.get('oms_network_id')}"/>
<!--此处代码已省略-->
</tree>
</field>
</page>
<!--此处代码已省略-->
</notebook>
</sheet>
<!--此处代码已省略-->
</form>
</field>
</record>
<!--此处代码已省略-->
</data>
</odoo>

修改ResPartner,重写模型name_search(编辑货主字段,弹出下拉列表时,会请求该模型函数),search_read(编辑货主字段,点击下拉列表时 搜索更多打开界面时,会请求该模型函数)

提示:分析OmsNetworkLine模型定义可知道,货主字段(partner_id)为多对一字段,关联ResPartner 模型

class ResPartner(models.Model):
_inherit = ['res.partner']
_name = 'res.partner' @api.model
def name_search(self, name='', args=None, operator='ilike', limit=100):
company_id = self.env.context.get('oms_network_company_id')
if company_id:
args = args or []
args.append(('company_id', '=', company_id))
res = super(ResPartner, self).name_search(name, args, operator, limit) return res @api.model
def search_read(self, domain=None, fields=None, offset=0, limit=None, order=None):
company_id = self.env.context.get('oms_network_company_id')
if company_id:
domain = domain or []
domain.append(('company_id', '=', company_id)) return super(ResPartner, self).search_read(domain, fields, offset, limit, order)

修改StockWarehouse,重写模型name_searchsearch_read

提示:分析OmsNetworkLine模型定义可知道,仓库字段(warehouse_id)为多对多字段,关联stock.warehouse 模型

class StockWarehouse(models.Model):
_inherit = 'stock.warehouse' # ...略 def _check_multiwarehouse_group(self):
pass @api.model
def name_search(self, name='', args=None, operator='ilike', limit=100):
oms_network_id = self.env.context.get('oms_network_id') warehouse_ids = self.env['oms.network'].browse([oms_network_id]).warehouse_ids.ids
if oms_network_id:
args = args or []
args.append(('id', 'in', warehouse_ids))
res = super(StockWarehouse, self).name_search(name, args, operator, limit)
return res @api.model
def search_read(self, domain=None, fields=None, offset=0, limit=None, order=None):
oms_network_id = self.env.context.get('oms_network_id')
warehouse_ids = self.env['oms.network'].browse([oms_network_id]).warehouse_ids.ids
if warehouse_ids:
domain = domain or []
domain.append(('id', 'in', warehouse_ids)) return super(StockWarehouse, self).search_read(domain, fields, offset, limit, order)

odoo 为可编辑列表视图字段搜索添加查询过滤条件的更多相关文章

  1. odoo开发笔记-- 按钮动作跳转到其他列表视图默认搜索

    按钮动作跳转到其他列表视图 按照默认指定的条件搜索显示. 效果: 实现方式:

  2. odoo开发笔记-tree列表视图拖拽排序

    odoo列表tree视图 拖拽排序 实现效果: 实现方式: 模型中定义字段: class CusYourModel(models.Model): """ 你的模型 &qu ...

  3. 第十章 Odoo 12开发之后台视图 - 设计用户界面

    本文将学习如何为用户创建图形化界面来与图书应用交互.我们将了解不同视图类型和小组件(widgets)之间的差别,以及如何使用它们来提供更优的用户体验. 本文主要内容有: 菜单项 窗口操作(Window ...

  4. delphi列表视图组件(TListView)使用方法|实例

    TListView 组件以多种形式显示列表的项目,如详细资料.小图标.大图标等形式表示列表中的项目.    列表视图与用TListBox 组件实现的列表框非常相似.不同的是,列表视图可以让用户选择不同 ...

  5. ElasticSearch 2 (15) - 深入搜索系列之多字段搜索

    ElasticSearch 2 (15) - 深入搜索系列之多字段搜索 摘要 查询很少是简单的一句话匹配(one-clause match)查询.很多时候,我们需要用相同或不同的字符串查询1个或多个字 ...

  6. VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下)

    上一节是关于列表视图控件List Control的上半部分,简单介绍了列表视图控件,其通知消息的处理和有关结构体的定义.本节继续讲解下半部分,包括列表视图控件的创建.CListCtrl类的主要成员函数 ...

  7. VS2010-MFC(常用控件:列表视图控件List Control 下)

    转自:http://www.jizhuomi.com/software/197.html 上一节是关于列表视图控件List Control的上半部分,简单介绍了列表视图控件,其通知消息的处理和有关结构 ...

  8. C#开发BIMFACE系列16 服务端API之获取模型数据1:查询满足条件的构件ID列表

    系列目录     [已更新最新开发文章,点击查看详细] 源文件/模型转换完成之后,可以获取模型的具体数据.本篇介绍根据文件ID查询满足条件的构件ID列表. 请求地址:GET https://api.b ...

  9. Sharepoint 2013列表视图和字段权限扩展插件(免费下载)!

    记得2014年春节期间,有博客园的网友通过QQ向我咨询Sharepoint 2013列表视图和字段权限扩展,因为之前他看到我博客介绍Sharepoint 2010列表视图和字段的权限控制扩展使用,问有 ...

  10. Odoo treeView列表视图详解

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826414.html TreeView:列表视图 1:<tree>标签的属性 [tree标签内 ...

随机推荐

  1. C温故补缺(十三):可变参数

    可变参数 stdarg.h 头文件提供了实现可变参数功能的函数和宏.具体步骤如下: 定义一个函数,最后一个参数为省略号,省略号前面可以设置自定义参数,一般传入参数的个数. int func(int n ...

  2. chrome设置socket5代理

    利用自带的参数命令打破一个死循环. chrome可执行文件 --show-app-list --proxy-server="SOCKS5://127.0.0.1:1080"

  3. 【笔面试题目】Java集合相关的面试题-List、Map、Set等

    一.List 1.subList 不会返回新的list对象--与String的subString不同 返回原来list的从[fromIndex,toIndex)之间这一部分的视图,实际上,返回的lis ...

  4. filter: hue-rotate() 制作炫酷的文字效果

    主要用到属性有: filter 滤镜的 hue-rotate 色调旋转, text-shadow 文字阴影, transform 的 scale缩放, transition 过渡属性, animati ...

  5. 【HarmonyOS】ArkTS Native开发——使用 system函数创建文件

    ​ ArkTS是HamronyOS优选的主力语言,但官方文档指南中对于Native应用开发并没有详细的描述,只有一篇Codelab可以学习(简易Native C++ 示例(ArkTS) (huawei ...

  6. 常用BOM操作 DOM操作 事件 jQuery类库

    目录 BOM操作 常用BOM操作 三种弹出框 alert confirm prompt 定时任务 setTimeout 循环定时 setInterval DOM操作 查找标签 直接查找 间接查找 操作 ...

  7. ATM购物车项目总结

    目录 项目实现思路 ATM项目 优先实现功能 拆分函数 项目路径展示 项目启动文件 start.py 配置文件 setting.py 日志配置字典 日志函数 展示层 src.py 用户注册 获取用户输 ...

  8. VS2019发布至远程IIS部署流程

    服务器部署 传统的开发将项目发布至本地桌面之后,复制至站点目录或通过FTP上传站点目录,有点小麻烦,通过开发工具VS2019本身集成的功能,可以一步到发布到远程IIS站点. 条件: VS系列发工具,例 ...

  9. Javascript | 分别用async await异步方法和Promise来实现一个简易的求职程序

      关注公众号,一起交流,微信搜一搜: LiOnTalKING   JavaScript Promise Promise 是一个 ECMAScript 6 提供的类,目的是更加优雅地书写复杂的异步任务 ...

  10. 粘包、struct模块、进程并行与并发

    目录 粘包现象 struct模块 粘包代码实战 udp协议(了解) 并发编程理论 多道技术 进程理论 进程并行与并发 进程的三状态 粘包现象 1.服务端连续执行三次recv 2.客户端连续执行三次se ...