Odoo14 动态过滤或联动domain

在 Odoo14 中最常用的动态过滤或联动domain的方法有两种
1. 使用 上下文 context  和 重写 _search() 或 _name_search() 方法
2. 使用 onchange() 装饰器 的 domain 返回值

示例:

这个图有字段:项目,上级任务,任务

要求:

        选择项目后,在选择上级任务时所能选择的上级任务都属于这个项目下的上级任务,

在选择任务的时候所能选择的任务都属与该上级任务下的任务(也属于项目下的任务)

关系:

class ProjTask(models.Model):
   
    _name = 'project.task'
    _description = '项目任务'

    bill_no = fields.Char(string='单据编号', index=True, copy=False, tracking=True)
    project_id = fields.Many2one('project.project', string="项目台账")
    name = fields.Char(string='项目名称')
    parent_id = fields.Many2one("project.task", string="父项任务")

下面这个是展示到页面的 模型表

class ProjMonthlyReportNextPlanLines(models.Model):
    _name = 'proj.monthly.report.next.plan.lines'
    _inherit = ['base.bill.line.template']
    _description = '下月工作计划'

    proj_id = fields.Many2one('project.project', string='项目')
    parent_task_id = fields.Many2one('project.task', string='父任务')
    task_id = fields.Many2one('project.task', string='任务')
    principal_id = fields.Many2one('hr.employee', string='负责人')

使用第一种方法:使用 上下文 context  和 重写 _search() 或 _name_search() 方法

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <data>
        <record id="proj_monthly_report_next_plan_lines_view_form" model="ir.ui.view">
            <field name="name">proj.monthly.report.next.plan.lines.view.form</field>
            <field name="model">proj.monthly.report.next.plan.lines</field>
            <field name="arch" type="xml">
                <form>
                  <group string="基本信息">
                    <field name="type" string="类型"/>
                    <field name="project_id" string="项目名称"
                      context="{'model':'project.project','type':'type'}"/>
                           # 这个 context 的值还可以是 字段 
                  </group>
                </form>
            </field>
        </record>
    </data>
</odoo>
class ProjectProject(models.Model):
    _name = ['project.project']

    @api.model
    def _search(self, args, offset=0, limit=None, order=None, count=False, access_rights_uid=None):
        args = args or []
        domain = []
        if 'model' in self.env.context:
            if self.env.context['model'] == 'project.project':
                
                domain.append(('id', 'not in', self.env['project.project'].search(
                    [('state', 'in', ['approval','done'])]).project_id.ids))

                # 根据表单其他字段过滤
                if self.env.context['type'] == 'M':
                    domain.append((...))
        return super(ProjectProject, self)._search(args + domain, offset, limit, order, count=count,
                                                   access_rights_uid=access_rights_uid)

上面是一个联动的列子,你需要过滤那个模型的字段就需要在那个模型下重写_search或 _name_search 方法,当然你的 context 需要写到对应需要过滤的表单下

使用第二种方法: 使用 onchange() 装饰器 的 domain 返回值
这个方法简便且一目了然,了解onchange装饰器的返回值即可:
代码如下:

 

class ProjMonthlyReportNextPlanLines(models.Model):
    _name = 'proj.monthly.report.next.plan.lines'
    _inherit = ['base.bill.line.template']
    _description = '下月工作计划'

    primary_id = fields.Many2one('proj.monthly.report', string='关联主表id')
    proj_id = fields.Many2one('project.project', string='项目')
    parent_task_id = fields.Many2one('project.task', string='父任务')
    task_id = fields.Many2one('project.task', string='任务')
    principal_id = fields.Many2one('hr.employee', string='负责人')

    @api.onchange('proj_id')
    def _onchange_project_id(self):
        for record in self:
            record.parent_task_id = None
            if record.proj_id:
                return {
                    'domain': {
                        'parent_task_id': [('project_id', '=', record.proj_id.id), ('parent_id', '=', None)]
                    }
                }

    @api.onchange('parent_task_id')
    def _onchange_parent_task_id(self):
        for record in self:
            record.task_id = None
            if record.parent_task_id:
                return {
                    'domain': {
                        'task_id': [('project_id', '=', record.proj_id.id), ('parent_id', '=', record.parent_task_id.id)]
                    }
                }

需要了解更多的 onchange装饰器返回值内容icon-default.png?t=N7T8https://blog.csdn.net/weixin_62077901/article/details/135620530?spm=1001.2014.3001.5501

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/328976.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论文笔记(四十)Goal-Auxiliary Actor-Critic for 6D Robotic Grasping with Point Clouds

Goal-Auxiliary Actor-Critic for 6D Robotic Grasping with Point Clouds 文章概括摘要1. 介绍2. 相关工作3. 学习 6D 抓握政策3.1 背景3.2 从点云抓取 6D 策略3.3 联合运动和抓握规划器的演示3.4 行为克隆和 DAGGER3.5 目标--辅助 DDPG3.6 对未知物体进行微调的后视目标 4. 实…

现代密码学 考点汇总(上)

现代密码学 考点汇总&#xff08;上&#xff09; 写在最前面考试范围一、给一个简单的方案&#xff0c;判断是否cca安全二、随机预言机模型之下的简单应用 0. 规约证明一个规约法证明PRG&#xff08;伪随机生成器&#xff09;的例子定长加密方案&#xff0c;并证明不可区分加密…

【二、自动化测试】为什么要做自动化测试?哪种项目适合做自动化?

自动化测试是一种软件测试方法&#xff0c;通过编写和使用自动化脚本和工具&#xff0c;以自动执行测试用例并生成结果。 自动化旨在替代手动测试过程&#xff0c;提高测试效率和准确性。 自动化测试可以覆盖多种测试类型&#xff0c;包括功能测试、性能测试、安全测试等&…

wins安装paddle框架

一、安装 https://www.paddlepaddle.org.cn/install/quick?docurl/documentation/docs/zh/install/pip/windows-pip.html 装包&#xff08;python 的版本是否满足要求&#xff1a; 3.8/3.9/3.10/3.11/3.12&#xff0c; pip 版本为 20.2.2 或更高版本 &#xff09; CPU 版:…

python贪吃蛇游戏

为了实现这个游戏&#xff0c;需要用到Python的pygame模块&#xff0c;它是一个专门用于开发游戏的模块&#xff0c;提供了很多方便的功能&#xff0c;比如窗口、图形、音效、事件处理等。 用pygame来创建一个窗口&#xff0c;设置游戏的背景色&#xff0c;画出蛇和食物&#…

Flutter首页框架搭建

1.下载flutter 2. 安装android 3.配置环境变量 关于环境搭建部分&#xff0c;哪天写一下&#xff0c;日志杂乱无章。 打开android studio 新建项目&#xff0c;选择flutter 新建文件夹创建 navigator和pages 文件夹下分别创建文件&#xff0c;tab_navigator.dart&#xff…

Docker RTMP服务器搭建与视频流推送示例(流媒体服务器tiangolo/nginx-rtmp,推流客户端ffmpeg)

文章目录 RTMP服务器搭建与视频流推送第一部分&#xff1a;搭建RTMP服务器&#xff08;流媒体服务器&#xff09;1.1 安装Docker1.2 搭建RTMP服务器 第二部分&#xff1a;使用ffmpeg进行视频推流&#xff08;推流客户端&#xff09;2.1 安装ffmpeg2.2 使用ffmpeg推流 第三部分&…

【数据结构】二叉树-堆(top-k问题,堆排序,时间复杂度)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​ 目录 堆排序 第一种 ​编辑 第二种 …

npm install 无反应 npm run serve 无反应

说明情况&#xff1a;其实最开始我就是发现我跟着黑马的苍穹外卖的前端day2的环境搭建做的时候&#xff0c;到这一步出现了问题&#xff0c;无论我怎么 npm install 和 npm run serve 都没有像黑马一样有很多东西进行加载&#xff0c;因此我换了一种方法 1.在这个文件夹下cmd …

助力工业焊缝质量检测,YOLOv3开发构建工业焊接场景下钢材管道焊缝质量检测识别分析系统

焊接是一个不陌生但是对于开发来说相对小众的场景&#xff0c;在我们前面的博文开发实践中也有一些相关的实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《轻量级模型YOLOv5-Lite基于自己的数据集【焊接质量检测】从零构建模型超详细教程》 《基于DeepLabV3Pl…

计算机组成原理-程序中断方式完整流程

文章目录 程序中断方式完整流程例题小结 程序中断方式完整流程 首先CPU通过执行IO指令来启动外部设备&#xff0c;此时外部设备可以开始做准备工作了&#xff08;准备CPU想要的数据或者信息&#xff09;&#xff0c;在外部设备准备过程中&#xff0c;CPU可以继续执行原程序的内…

CES 2024,从枕头到汽车,一切皆可AI

文 / 胡泳 北京大学新闻与传播学院教授 世界上最大的消费类电子展CES是令人难以置信的创新的展示舞台。 我在拉斯维加斯泡了四五天&#xff0c;跟踪了展出的大部分小工具、应用程序和概念产品。这些产品既有趣又实用&#xff0c;它们要么以全新的方式利用技术解决了某个特定的问…

AI对决:ChatGPT与文心一言的比较

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 引言ChatGPT与文心一言的比较Chatgpt的看法文心一言的看法Copilot的观点chatgpt4.0的回答 模型的自我评价自我评价 ChatGPT的优势在这里插入图片描述 文…

JS-var 、let 、 const使用介绍

变量声明介绍 在我们日常开发用&#xff0c;变量声明有三个 var、 let 和 const&#xff0c;我们应该用那个呢&#xff1f; 首先var 先排除&#xff0c;老派写法&#xff0c;问题很多&#xff0c;可以淘汰掉…let or const ?建议&#xff1a; const 优先&#xff0c;尽量使…

CSS 水浪按钮

<template><view class="content"><button class="button"><view class="liquid"></view><view class="btn-txt">水浪按钮</view></button></view></template><scrip…

QT上位机开发(MFC vs QT)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在qt之前&#xff0c;上位机开发的主要方法就是mfc。后来出现了c#语言之后&#xff0c;上位机的开发就有一部分人转成了c#。这些开发都是在windows…

Vue + JS + tauri 开发一个简单的PC端桌面应用程序

Vue JS tauri 开发一个简单的PC端桌面应用程序 文章目录 Vue JS tauri 开发一个简单的PC端桌面应用程序1. 环境准备1.1 安装 Microsoft Visual Studio C 生成工具[^2]1.2 安装 Rust[^3] 2. 使用 vite 打包工具创建一个 vue 应用2.1 使用Vite创建前端Vue项目2.2 更改Vite打包…

Android Traceview 定位卡顿问题

Traceview 是一个 Android 性能分析工具&#xff0c;用于时间性能分析&#xff0c;主要帮助开发者了解应用程序中各个方法的执行时间和调用关系。通过图形化界面查看应用程序的代码执行细节&#xff0c;包括每个方法的调用次数、方法调用的时间消耗、方法调用堆栈等信息。我们可…

基于Python实现身份证信息识别

目录 前言身份证信息识别的背景与意义自动识别身份证的需求实现环境与工具准备Python编程语言OpenCV图像处理库Tesseract OCR引擎身份证信息识别算法原理图像预处理步骤(图像裁剪、灰度化 、二值化、去噪)信息提取与解析Python代码实现通过OCR提取身份证号码代码解析身份证信息…

uniapp 如何使用echarts 以及解决tooltip自定义不生效;dataZoom报错问题

使用的是echarts-for-wx插件&#xff1b; 正常写法案例&#xff1a;给tooltip数值加个% <template><view><uni-ec-canvas class"uni-ec-canvas"id"uni-ec-canvas"ref"canvas"canvas-id"uni-ec-canvas":ec"ec&quo…