
odoo12
记录自己在odoo方面的采坑
_鹿哥
这个作者很懒,什么都没留下…
展开
-
form表单按钮根据编辑/只读状态显示和隐藏
odoo form表单自定义按钮显示/隐藏原创 2024-07-31 17:27:46 · 328 阅读 · 0 评论 -
odoo的controller层获取当前action的domain
odoo的controller层获取菜单action中的domain原创 2022-05-13 10:46:01 · 553 阅读 · 0 评论 -
odoo中one2many子表按条件隐藏行
odoo子表按条件过滤行数据原创 2022-04-01 20:54:16 · 923 阅读 · 0 评论 -
odoo字段定义中的states属性用法
odoo字段定义属性之: states这个字段需要配合另一个selection字段使用, 查看odoo源码发现依赖的这个字段都被定义成state, 看字面意思states这个属性的作用应该是控制表单在流程状态中字段的状态, 具体依赖的字段是不是必须定义成state没有去深究, 有兴趣的小伙伴可以去研究一下,欢迎留言解释下面说一下这个属性的用法:state = fields.Selection([ ('draft', 'To Submit'), ('cancel'原创 2022-02-28 15:44:15 · 955 阅读 · 0 评论 -
odoo时间和日期字段默认值不对,出现时差问题
odoo时间日期默认值原创 2021-12-24 16:31:35 · 1121 阅读 · 0 评论 -
odoo计算字段重新计算odoo recompute
odoo计算字段如果是store=True存在数据库中的,不通过depends绑定的字段变化去触发计算,又想让计算字段重新计算一次值的时候,可以使用如下两种方法触发重新计算原理: 两种方法的原理都是通过api.py中定义的add_todo和recompute()方法触发字段的重新计算,add_todo函数的第一个参数需要传入一个字段对象,第二个参数是需要重新计算的记录方法1: odoo脚本运行模式,即odoo shell模式>>> model = env['模型名称']原创 2021-11-02 16:54:57 · 886 阅读 · 0 评论 -
odoo继承过来的模型定义_rec_name不生效解决办法
odoo模型有几个常用的属性,比如_rec_name。如果继承别的模型重新定义了_rec_name,你会发现你数据库中的字段存在,但是_rec_name并没有生效下面说一下解决办法:重新定义的_rec_name需要重写name_get函数才能生效,name_get是关系型字段,下拉框点击时调用获取下拉列表的函数,需要返回一个[(),(),(),()....]格式的数据 @api.multi def name_get(self): return [(record.i原创 2021-10-13 15:08:49 · 737 阅读 · 0 评论 -
odoo只读字段和related字段保存时获取值 force_save
odoo中如果是只读字段和related字段这中在视图中只读的字段,你会发现,在create和write函数中传入的参数vals值中是没有的,无法直接从vals中获取。那怎么样可以让create函数和write函数获取到只读字段的值呢,方法其实很简单在视图定义字段的时候,增加属性force_save='1',字面意思就可以看出来,这个属性是强制保存的意思,这样,只读字段就可以保存了示例如下:<field name="字段名" force_save="1"/>...原创 2021-09-24 17:27:35 · 1250 阅读 · 0 评论 -
odoo通用导出列表视图数据为excel表
介绍一下oca开源模块通用导出web_export_view模块,可以将列表视图上的字段信息,导出为一个excel表,模块文件上传至博客文件下载中,可自行免费下载,或者去odoo应用商店下载1.安装oca的web_export_view模块2.使用演示:如图所示,安装这个模块以后,选中列表记录前面的勾选框,动作旁边会出现一个excel文件的图标,点击图标就可以下载excel文件如果觉得通用导出不符合自己的需求,后面会介绍通过python的方式自定义导出excel文件的方式...原创 2021-09-16 19:48:07 · 618 阅读 · 0 评论 -
odoo列表视图使用oca第三方模块给单元格定义不同颜色
odoo的oca组织开发了很多开源的模块,有很多有趣实用的功能,今天介绍一下web_tree_dynamic_colored_field利用这个模块,可以让单元格根据字段的值不同,显示不同的颜色,对用颜色区分状态很实用,虽然odoo自带了这个功能,但是oca开发的这个模块,更灵活,颜色支持也更多,下面展示一下使用方式1. 安装oca的字段颜色模块,没有下载这个模块的朋友我把模块文件上传在我的博客里,大家自己去下载一下2. 定义需要使用单元格颜色的模型列表视图<odoo>原创 2021-09-16 17:07:05 · 867 阅读 · 0 评论 -
odoo模型基础mail.thread在form页面底部记录字段值变化日志
odoo的mail.thread模块实现了字段变化日志的保存功能,只需要很简单的操作就可以实现自定义模型的字段变化日志 One2many和Many2many字段不生效 具体原因可以查看odoo源码中odoo/addons/mail/models/mail_tracking_value.py 中39行create_tracking_values函数中的处理,是没有对x2many字段做处理的,猜想是因为这两个字段的特殊性,信息不是存在当前模型的数据库表中的进入正题,只需要很简单的步骤继承mail.thr原创 2021-09-16 16:41:00 · 822 阅读 · 0 评论 -
odoo向导
odoo中有很多地方使用到了向导,实际上是通过一个瞬态模型作为中间模型处理数据,来达到某些模型上不好直接处理的数据向导的流程:定义瞬态模型的模型和视图 -> 定义一个动作以及动作对应的方法打开瞬态模型的form视图 -> 定义瞬态模型form视图底部按钮 -> 瞬态模型中处理数据示例步骤如下: 注意:新定义的模型需要在权限文件ir.model.access.csv中注册,新定义的视图如果是单独文件,需要在__manifest__.py中引入1. 创建瞬态模型from原创 2021-09-15 15:45:11 · 933 阅读 · 0 评论 -
视图中按钮使用对话框,点确认执行后续操作,点取消不执行后续操作
odoo视图中的按钮,可以通过很简单的方式使用对话框,只需要定义一个comfirm属性就可以调用odoo的对话框,猜想这个对话框应该是基于jquery的,没有验证过示例如下:<button name="cancel_overhaul_material_apply" type="object" string="XXXX" class="btn" confirm="弹窗标题"/>可以在tree视图也可以在form视图中使用效果如下:...原创 2021-09-14 15:59:31 · 290 阅读 · 0 评论 -
odoo列表字段颜色,行颜色,many2many_tags颜色,看板颜色
odoo自带了一套简单的设置颜色的方式,可以设置列表中某个字段的颜色,某些行的颜色,一级2many字段的many2many_tags的颜色,还有看板的颜色,下面列举一下各个地方颜色设置的方式列表行的颜色设置只需要在tree标签上添加颜色属性,比如decoration-success=“id != False”,当表达式值为真就会颜色就会生效,当表达式的值为假不生效decoration-xxx(表示颜色的词),下面列举出可选值及颜色<tree decoration-success="表达式原创 2021-09-09 16:16:35 · 2944 阅读 · 5 评论 -
odoo动态domain-根据一个字段变化动态改变其他关系字段的domain
odoo的后端可以利用onchange这个api监控页面上字段的变化。利用这个api还可以动态的改变其他字段的domain筛选条件,这个在有些场景下是非常有用的。下面给出示例:@api.onchange('字段A') def 函数名(self): ''' 根据字段A返回字段B的domain ''' # ...其他逻辑代码 return { 'domain': {'关系型字段B': [(筛选条件)原创 2021-09-09 09:43:54 · 1220 阅读 · 0 评论 -
odoo列表视图左上角建立和导入旁边新增按钮,调用后端方法
odoo的列表视图左上角新增按钮调用后端方法时,可以通过ir.actions.server来新增自己想要的按钮调用后端的方法示例如下:<record id="自定义id" model="ir.actions.server"> <field name="name">按钮显示名称</field> <field name="model_id" ref="模型id(model_XXXX)"/>原创 2021-08-10 14:22:48 · 469 阅读 · 0 评论 -
odoo利用postsql表的继承性实现父模型与子模型记录同步
如果遇到有些场景中,多个模型有很多相同字段或者相同功能,可以通过postsql的表继承特性,将多个模型抽象出一个父模型,将相同功能和相同字段放到父模型当中,独特的有差异的字段或者属性放到子模型中,这样子表的记录和父表的记录可以保持一致,增删改查保持同步**实现方式可以参照ir.actions.actions模型及其子模型的实现方式,在odoo框架自带模块中的odoo/odoo/addons/base模块中**具体实现方式如下:需要定义一个sql文件,先创建出子父级表的表名和继承关系,我这里放在模块原创 2021-08-04 18:02:20 · 234 阅读 · 0 评论 -
odoo弹出选择弹窗,在列表视图选择记录操作
odoo可以通过弹窗弹窗列表视图,选择指定模型的记录进行操作常见的场景比如many2many或者one2many字段,需要一次选择多条记录的时候,可以通过自定义的按钮,在js中弹出弹窗,显示列表中的记录进行操作弹窗示例如下:var dialogs = require('web.view_dialogs');new dialogs.SelectCreateDialog(self, { res_model: '弹窗对应的模型原创 2021-07-15 13:41:24 · 1224 阅读 · 0 评论 -
odoo后端动态修改视图中元素的属性
如果需要odoo后端对视图属性做动态修改,即加载视图时,根据后端逻辑修改视图中元素的属性,可以通过fields_view_get实现。原理应该是odoo加载视图之前会先加载这个函数获取修改结果。如果没有任何修改,就会按照xml中定义的视图进行渲染只需要在对应模型中定义fields_view_get函数即可实现示例如下: def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False):原创 2021-07-09 11:14:54 · 965 阅读 · 0 评论 -
odoo在视图中给字段默认值
通过视图给字段中的字段赋值,是通过contex上下文传递字段的默认值的,视图中context要在action中才有上下传递,传递给具体的视图给视图中的字段赋值分为两种情况:一种是给主表视图中的字段赋值另一种是给many2many,many2one等关系型字段值中的子表字段赋值先说给主表中的字段赋值的情况,由于视图级别默认值只能通过上下文的传递,把默认值传给页面中的字段,所以,就需要定义在action中的context中,具体示例如下:<record id='xxx视图id' model='i原创 2021-06-28 16:55:12 · 1094 阅读 · 0 评论 -
odoo计算字段后端重定义前端的搜索条件的domain
有时候无法在xml的视图定义中定义搜索的domain的时候,或者不好定义搜索到domain的时候,可以在后端对搜索条件的domain进行重定义,返回一个新的domain,示例如下:字段定义中指定search的函数:starred = fields.Boolean( compute='_compute_starred', inverse='_inverse_starred', search='_search_starred', string原创 2021-06-23 18:20:04 · 411 阅读 · 0 评论 -
增加options属性将odoo的many2many_checkboxes改为多列显示
最近使用到odoo的原生many2many_checkboxes,但是发现一个问题,当候选项比较多的时候,他是单列显示,会把页面撑的很大,下面给出我的解决办法,在视图定义中,字段的option参数中添加col_count参数,修改addons/web/static/src/js/fields/路径中relational_fields.js文件的FieldMany2ManyCheckBoxes仔细看FieldMany2ManyCheckBoxes中的函数就会发现,渲染候选项是在_renderCheckbox原创 2021-06-23 16:32:54 · 1128 阅读 · 0 评论 -
odoo的子表的tree视图字段根据条件控制是否显示
odoo子表的列表视图,想要根据条件控制是否显示,需要在attrs中使用’column_invisible’属性,写法和attrs中的invisible属性用法一致,区别是字段需要使用父表中的字段。示例如下:<field name="is_vehicle_location_1_display" invisible="1"/><field name="electric_vehicle_line_ids"> &原创 2021-06-17 12:03:15 · 1127 阅读 · 2 评论 -
odoo自定义js打开dialog视图,底部添加自定义按钮
有时候需要在js的处理逻辑当中打开视图,比如按钮点击的时候打开视图,并且在底部显示自定义的按钮,示例如下:var view_dialogs = require('web.view_dialogs');var buttons = [{ text: '按钮文字', classes: "btn-success", //按钮class样式 click: function () {原创 2021-06-10 15:02:15 · 702 阅读 · 0 评论 -
odoo自定义js调用odoo原生提示弹窗,确认对话框
有时候odoo的原生功能不能满足需求的时候,经常会使用自定义的js文件去达到自己的目的,如果需要在js文件里面使用odoo原生的确认框,确认对话框,请查看如下示例:var Dialog = require('web.Dialog'); //引入odoo的dialog弹窗对象Dialog.confirm(self, '对话框内容', { title: '标题', confirm_callback: functi原创 2021-06-10 14:44:18 · 1163 阅读 · 17 评论 -
odoo的domain筛选之child_of、parent_of
有时候遇到需要搜索或者筛选出层级关系中,某个节点以后该节点的所有子节点,或者某节点以及该节点的所有父节点的记录时,需要使用odoo的child_of,和parent_of两个筛选条件使用示例:self.search([('id', 'child_of', menu_roots.ids)])domain="[('hr_department_id', 'child_of', parent.department_id)]"('id', 'parent_of', self.subsystem_id.id)原创 2021-06-10 14:33:41 · 1737 阅读 · 10 评论 -
odoo的many2many和one2many字段给默认值
odoo的x2many字段由于赋值方式比较特殊,所以不能像普通字段一样直接给默认值,需要返回一个列表里面嵌套列表结构的数据。1.先看many2many和one2many字段的赋值方式:many2many(0,0,{values}) 根据values里面的信息新建一个记录。(1,ID,{values})更新id=ID的记录(写入values里面的数据)(2,ID) 删除id=ID的数据(调用unlink方法,删除数据以及整个主从数据链接关系)(3,ID) 切断主从数据的链接关系但是不删除这个数据原创 2021-06-09 15:40:35 · 1524 阅读 · 0 评论 -
odoo自定义js模仿odoo的按钮点击事件进行数据操作以后刷新form页面数据
有时候,自己定义的js对form页面的数据进行了更改,form视图是无法自动刷新值的,需要我们调用form视图的刷新函数进行数据刷新解决办法:为了保持数据与后端数据一致,可以先调用read函数读取最新的数据,具体操作示例如下:self._rpc({ model: '模型名称', method: 'read', args: [self.record.res_id],// 当前记录id }).then(function原创 2021-06-09 15:33:21 · 1816 阅读 · 3 评论 -
odoo的One2many或者many2many表的字段获取父级表字段作为domain的条件
x2many的字段的父级表中的字段,不能直接作为domain的筛选条件使用。但是有时候又会遇到需要使用父级表字段的场景。解决办法一:利用parent去找父级表的字段,这个用法的好处是前后端都适用,具体使用方式如下:python:domain="[('当前表字段', '条件', parent.父表字段)]"xml:<field name="父表x2many字段"> <tree>原创 2021-06-07 18:10:00 · 1153 阅读 · 1 评论 -
odoo后端跳转到指定form视图,并且默认可编辑模式
odoo的后端可以通过返回一个ir.actions.act_window实例跳转到一个指定的视图代码如下:form_id = self.env.ref('模块名称.视图id').id return { "type": "ir.actions.act_window", "view_mode": "form", "res_id": self.id, "res原创 2021-06-04 15:02:57 · 1913 阅读 · 0 评论 -
odoo中用onchange和depends修饰的方法无法从self中获取当前记录的id
今天偶然发现使用onchange和depends修饰的方法无法直接从self中获取当前id。即使当前记录已经存在与数据库中,发现此时self中的self.id是一个类似newID的虚拟id。不知道odoo这样做的原因是什么,但是如果需要用到id的时候怎么办呢。下面说一下解决办法:self中会有一个属性,存储当前记录的数据库id,就是:self._origin,通过self._origin.id就可以拿到当前记录的id了...原创 2021-06-04 13:03:13 · 960 阅读 · 0 评论 -
odoo字段定义中使用其他字段值
odoo字段定义的时候,可以使用同模型中其他值进行操作,下面列举常用的操作用作related计算字段1 = fields.Char(related='字段2.字段xxx')字段2 = fields.Many2one('模型名')如果字段2是关系型字段many2one,引号中可以用点.引用该字段对应模型的其他字段值,如果是普通字段,则只能取该字段值,没有点其他字段名的操作2.用作doamin操作:字段1 = fields.Many2one('模型1名', domain="[('id', 'i原创 2021-05-14 22:34:54 · 1013 阅读 · 0 评论 -
odoo点击按钮弹出列表选择框
odoo中需要打开列表视图,选择目标记录操作的时候,可以通过选择弹窗,指定列表视图选择记录进行操作操作如下:在js文件中添加如下代码:new dialogs.SelectCreateDialog(self, { res_model: '列表视图对应模型name', domain: domain筛选条件,原创 2021-05-14 22:20:44 · 1255 阅读 · 0 评论 -
odoo中前端消息通信机制core.bus
odoo的消息通信分为前端-前端(core.bus.trigger)和前端-后端(longpolling)记录一下core.bus,trigger使用,longpolling使用在另一篇文章,有兴趣可以查看1.代码演示:core.bus.trigger('update_menu_info')# 发送消息core.bus.on('update_menu_info', this, function () { # 消息处理逻辑 }); #监听消息原创 2021-04-26 11:47:03 · 757 阅读 · 1 评论 -
odoo中消息机制longpolling的使用
1.odoo中消息机制有几种,比如(1).用于前端的消息机制core.bus.trigger/core.bus.on(2).用于前后端消息通信的longpolling消息机制2.前端消息通信的使用之前文章已经记录过,说一下前后端消息机制longpolling的使用(1).前端部分:this.call('bus_service', 'addChannel', 'menu_badge');this.call('bus_service', 'onNotification', self, this._o原创 2021-04-26 11:32:32 · 1488 阅读 · 0 评论 -
odoo中Many2one字段在form视图中,候选项太多以后,指定搜索更多按钮跳转的视图
odoo中many2one字段当候选项太多的时候,点击搜索更多会跳转到tree视图中,这个时候目标tree视图是可以指定的odoo提供了指定视图的方法,在form视图中该字段中添加context参数,context中指定"tree_view_ref"属性,即可指定跳转的目标视图具体如下:<field name="employee_id" options="{'no_create_edit': True,'no_open': True,原创 2021-03-22 16:18:54 · 1275 阅读 · 0 评论 -
odoo在form视图右上角添加按钮的方法
odoo的提供了原生方法,在form视图右上角添加按钮具体实现如下:1. 在视图中sheet标签下添加按钮button_box模块<form> <sheet> <div class="oe_button_box" style="width:100px !important" name="button_box" attrs="{'invisible': [('id', '=', False)]}">原创 2021-01-14 14:56:45 · 1359 阅读 · 0 评论 -
odoo的one2many字段的form视图底部按钮自定义
odoo的one2many底部自带了一套按钮:'保存并关闭','保存并新建','取消','移除' 但是如果有时候不想要自带的按钮怎么办呢?首先想到的肯定是footer标签覆盖原来的footer标签,但是你会发现此时会出现两个可能的问题: 1.自定义的按钮渲染成功,但是点击按钮会连带把父级的form表单一起关闭 2.按钮渲染上去,但是点击不起作用解决办法:1.仍然是先添加footer标签覆盖原来的footer标签,不同的是,现在不直接写button,而是用widg...原创 2020-12-25 10:10:05 · 776 阅读 · 0 评论 -
odoo的one2many字段新增不跳到form视图,直接在tree视图编辑
one2many字段默认的新增方式是跳转到form视图中去编辑.但是有时候这样的方式不是很适合当前场景,想要在tree视图中直接编辑解决方式:在xml视图中,给one2many字段加上editable="bottom"属性就可以了原创 2020-11-25 10:55:26 · 1128 阅读 · 0 评论 -
odoo中js里面extend和include的区别
include和extend的区别:include:源文件.include表示将源文件全部引入到此处,并且对源文件进行修改.并且引用的对象必须是已经注册的extend:源文件.extend表示将源文件内容全部拷贝到当前位置,进行自己的修改以后生成新的文件.发生的改动不改变源文件内容...原创 2020-11-06 11:11:22 · 1052 阅读 · 0 评论