目录
1、需求描述
2、实现步骤
2.1 主要文件目录结构
2.2 js文件的创建
2.3 创建按钮模板
2.4 定义xml文件引入js代码
2.5 定义向导和所对应的动作视图
点击下图中tree视图上的同步退货单按钮,弹出相应的form视图进行退货单同步,然后点击同步按钮调用后端python代码处理。
在static文件夹下面创建一个名为js的文件夹,编写相应的js文件
odoo.define('dms_gaunyi.list_sync_trade_return', function (require) {
"use strict";
var ListView = require('web.ListView');
var viewRegistry = require('web.view_registry');
var ListController = require('web.ListController');
ListController.include({
renderButtons: function ($node) {
this._super.apply(this, arguments);
if (this.$buttons) {
this.$buttons.on('click', '.o_list_tender_bt_sync_trade_return', this._sync_equip_trade_return.bind(this));
}
},
_sync_equip_trade_return: function () {
var self = this;
self.do_action({
name: '同步退货单',
res_model: 'action.sync.trade.return',
views: [[false, 'form']],
type: 'ir.actions.act_window',
view_mode: 'form',
target: 'new',
});
}
})
})
define方法的第一个参数为名称,自行定义,require方法表示所用到的依赖,然后对按钮的点击事件绑定相应的方法,这个方法返回一个动作视图(就是所定义的瞬态模型的向导)。
也就是定义在/static/xml 文件夹下面的xml文件,用来定义所加的按钮
注意:此处所定义的class 与 js文件定位按钮时的class相对应
在views文件夹下面定义templates.xml文件,src对应js文件所在路径
注意:此处定义的xml文件需要在__manifest__文件中引入
定义模型(继承自瞬态模型)和点击同步按钮所对应的方法。
class ActionSyncTradeReturnOrder(models.TransientModel):
_name = 'action.sync.trade.return'
_description = "同步退货订单"
channel = fields.Many2one('dms.sync.account', domain=[('channel', '!=', 'amazon')], required=True)
origin_no_code = fields.Char(string="发货单号", help="多个单号用英文字母”,“隔开")
def sync_defect_order(self):
...
视图部分(即action_sync_trade_return.xml文件)代码:
同步退货单
action.sync.trade.return
同步退货单
action.sync.trade.return
form
new
在这个案例中,我遇到过同步数据后视图并没有立刻刷新数据,而要手动刷新的问题。
解决方法:
在python方法对数据处理之后返回一个动作视图,这个动作视图将跳转对应的tree视图,代码如下:
def sync_defect_order(self):
codes = self.origin_no_code.strip(' ').split(',')
m_name = 'action_sync_trade_return_from_code_%s' % self.channel.channel
.....
return {
'name': _('%s退货报告' % self.channel.name),
'res_model': 'dms.trade.return',
'view_id': False,
'type': 'ir.actions.act_window',
'view_mode': 'tree,form',
'domain': [('channel', '=', self.channel.channel)],
'context': {
'default_channel': self.channel.channel,
}
}
其中的res_model指的是最初界面的模型
我们在开发的过程中往往会继承已有的模型,从而一个模型就会有多个form视图或者tree视图,
但是我们在tree视图上定义按钮时不想在这个模型的所有视图上面定义,而是在这个模型指定的tree视图定义,这时候就需要在定义按钮的地方加上限制条件。代码如下所示:
其中有两个条件,res.partner表示按钮加在res.partner这个模型上面,第二个条件是定义的tree视图的id。