- 博客(65)
- 资源 (2)
- 收藏
- 关注
原创 odoo子表记录无法保存,且没有明显报错提示
查看该js代码发现是列表排序字段问题报错,断点查看发现list中没有排序的这个字段,查看视图发现问题, 子表列表指定的排序字段,没有定义在列表中,所以报错。在列表中补充定义排序的字段,如果不想显示,可以指定invisible。
2024-01-30 17:15:05
331
原创 vue报错webpackContextResolve (eval at ./src sync recursive ^\.\/.*$
vue报错webpackContextResolve (eval at ./src sync recursive ^\.\/.*$
2022-03-14 16:33:51
13381
1
原创 odoo命令行生成配置文件
要为odoo生成配置文件, 只需要在命令行将目录切换到odoo-bin所在的目录执行以下命令即可:./odoo-bin —save —config myodoo.cfg —stop-after-init
2022-03-10 09:12:33
2426
原创 odoo字段定义中的states属性用法
odoo字段定义属性之: states这个字段需要配合另一个selection字段使用, 查看odoo源码发现依赖的这个字段都被定义成state, 看字面意思states这个属性的作用应该是控制表单在流程状态中字段的状态, 具体依赖的字段是不是必须定义成state没有去深究, 有兴趣的小伙伴可以去研究一下,欢迎留言解释下面说一下这个属性的用法:state = fields.Selection([ ('draft', 'To Submit'), ('cancel'
2022-02-28 15:44:15
946
原创 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
875
原创 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
733
原创 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
1243
原创 odoo通用导出列表视图数据为excel表
介绍一下oca开源模块通用导出web_export_view模块,可以将列表视图上的字段信息,导出为一个excel表,模块文件上传至博客文件下载中,可自行免费下载,或者去odoo应用商店下载1.安装oca的web_export_view模块2.使用演示:如图所示,安装这个模块以后,选中列表记录前面的勾选框,动作旁边会出现一个excel文件的图标,点击图标就可以下载excel文件如果觉得通用导出不符合自己的需求,后面会介绍通过python的方式自定义导出excel文件的方式...
2021-09-16 19:48:07
611
原创 odoo列表视图使用oca第三方模块给单元格定义不同颜色
odoo的oca组织开发了很多开源的模块,有很多有趣实用的功能,今天介绍一下web_tree_dynamic_colored_field利用这个模块,可以让单元格根据字段的值不同,显示不同的颜色,对用颜色区分状态很实用,虽然odoo自带了这个功能,但是oca开发的这个模块,更灵活,颜色支持也更多,下面展示一下使用方式1. 安装oca的字段颜色模块,没有下载这个模块的朋友我把模块文件上传在我的博客里,大家自己去下载一下2. 定义需要使用单元格颜色的模型列表视图<odoo>
2021-09-16 17:07:05
854
原创 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
813
原创 odoo向导
odoo中有很多地方使用到了向导,实际上是通过一个瞬态模型作为中间模型处理数据,来达到某些模型上不好直接处理的数据向导的流程:定义瞬态模型的模型和视图 -> 定义一个动作以及动作对应的方法打开瞬态模型的form视图 -> 定义瞬态模型form视图底部按钮 -> 瞬态模型中处理数据示例步骤如下: 注意:新定义的模型需要在权限文件ir.model.access.csv中注册,新定义的视图如果是单独文件,需要在__manifest__.py中引入1. 创建瞬态模型from
2021-09-15 15:45:11
927
原创 postsql将一个表数据插入到另一个表
postsql从一个表将数据复制到另一个表中,sql语句如下:INSERT INTO table_A(column_1,column_2,column_3)SELECTcolumn_1,column_2,column_3FROMtable_Bwhere table_B筛选条件;
2021-09-15 14:57:09
1317
原创 视图中按钮使用对话框,点确认执行后续操作,点取消不执行后续操作
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
285
原创 odoo列表字段颜色,行颜色,many2many_tags颜色,看板颜色
odoo自带了一套简单的设置颜色的方式,可以设置列表中某个字段的颜色,某些行的颜色,一级2many字段的many2many_tags的颜色,还有看板的颜色,下面列举一下各个地方颜色设置的方式列表行的颜色设置只需要在tree标签上添加颜色属性,比如decoration-success=“id != False”,当表达式值为真就会颜色就会生效,当表达式的值为假不生效decoration-xxx(表示颜色的词),下面列举出可选值及颜色<tree decoration-success="表达式
2021-09-09 16:16:35
2929
6
原创 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
1210
原创 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
459
原创 odoo利用postsql表的继承性实现父模型与子模型记录同步
如果遇到有些场景中,多个模型有很多相同字段或者相同功能,可以通过postsql的表继承特性,将多个模型抽象出一个父模型,将相同功能和相同字段放到父模型当中,独特的有差异的字段或者属性放到子模型中,这样子表的记录和父表的记录可以保持一致,增删改查保持同步**实现方式可以参照ir.actions.actions模型及其子模型的实现方式,在odoo框架自带模块中的odoo/odoo/addons/base模块中**具体实现方式如下:需要定义一个sql文件,先创建出子父级表的表名和继承关系,我这里放在模块
2021-08-04 18:02:20
231
原创 odoo弹出选择弹窗,在列表视图选择记录操作
odoo可以通过弹窗弹窗列表视图,选择指定模型的记录进行操作常见的场景比如many2many或者one2many字段,需要一次选择多条记录的时候,可以通过自定义的按钮,在js中弹出弹窗,显示列表中的记录进行操作弹窗示例如下:var dialogs = require('web.view_dialogs');new dialogs.SelectCreateDialog(self, { res_model: '弹窗对应的模型
2021-07-15 13:41:24
1209
原创 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
960
原创 odoo在视图中给字段默认值
通过视图给字段中的字段赋值,是通过contex上下文传递字段的默认值的,视图中context要在action中才有上下传递,传递给具体的视图给视图中的字段赋值分为两种情况:一种是给主表视图中的字段赋值另一种是给many2many,many2one等关系型字段值中的子表字段赋值先说给主表中的字段赋值的情况,由于视图级别默认值只能通过上下文的传递,把默认值传给页面中的字段,所以,就需要定义在action中的context中,具体示例如下:<record id='xxx视图id' model='i
2021-06-28 16:55:12
1085
原创 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
403
原创 增加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
1119
原创 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
1108
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
693
原创 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
1149
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
1725
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
1517
原创 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
1803
3
原创 odoo的One2many或者many2many表的字段获取父级表字段作为domain的条件
x2many的字段的父级表中的字段,不能直接作为domain的筛选条件使用。但是有时候又会遇到需要使用父级表字段的场景。解决办法一:利用parent去找父级表的字段,这个用法的好处是前后端都适用,具体使用方式如下:python:domain="[('当前表字段', '条件', parent.父表字段)]"xml:<field name="父表x2many字段"> <tree>
2021-06-07 18:10:00
1144
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
1898
1
原创 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
950
原创 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
998
原创 odoo点击按钮弹出列表选择框
odoo中需要打开列表视图,选择目标记录操作的时候,可以通过选择弹窗,指定列表视图选择记录进行操作操作如下:在js文件中添加如下代码:new dialogs.SelectCreateDialog(self, { res_model: '列表视图对应模型name', domain: domain筛选条件,
2021-05-14 22:20:44
1242
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人