翼度科技»论坛 编程开发 python 查看内容

Odoo 通过Javascript调用模型中自定义方法

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
实践环境

Odoo 14.0-20221212 (Community Edition)
代码实现

在js脚本函数中调用模型中自定义方法:
  1. this._rpc({
  2.     model: 'demo.wizard', // 模型名称,即模型类定义中 _name 的值
  3.     method: 'action_select_records_via_checkbox', // 模型中自定义名称
  4.     args: ['arg_value'] // 传递给模型方法参数列表,列表中每个元素对应模型方法的一个位置参数
  5. }).then(function (res) { // res为模型方法返回值
  6.     console.log(res);
  7.     // do something
  8. });
复制代码
模型方法定义
  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. from odoo import models,fields,api
  4. class DemoWizard(models.TransientModel):
  5.     _name = 'demo.wizard'
  6.     _description = 'demo wizard'
  7.     #...此处代码已省略
  8.    
  9.     @api.model
  10.     def action_select_records_via_checkbox(self, *args):
  11.         '''通过wizard窗口界面复选框选取记录时触发的操作
  12.         @params: args 为tuple元组,如果方法不采用位置参数,则传递的是啥,参数就是啥
  13.         '''
  14.         # do something
  15.         
  16.         return True
复制代码
注意:this._rpc函数不能在非普通函数中使用,其使用范围可参考以下示例
  1. odoo.define('estate.ListRenderer', function (require) {
  2.     "use strict";
  3.         var ListRenderer = require('web.ListRenderer');
  4.         ListRenderer = ListRenderer.extend({
  5.         _onToggleCheckbox: function (ev) {
  6.             //// ...此处代码已省略
  7.             this._rpc({
  8.                 model: this.modelName,
  9.                 method: this.modelMethod,
  10.                 args: [this.recordsSelected]
  11.             }).then(function (res) {
  12.                 // ...此处代码已省略
  13.             });
  14.              ...
  15.             this._super.apply(this, arguments);
  16.         }
  17.         });
  18.     // ...此处代码已省略
  19. });
复制代码
那问题来了,如果希望在普通的javascript函数中使用上述请求功能,咋办?参考如下示例代码
示例代码
  1. function do_confirm_action(modelName, modelMethod){
  2.     $("button[name='action_confirm']").attr("disabled", true);
  3.     var wizard_dialog = $(event.currentTarget.offsetParent.parentElement.parentElement);
  4.     var dataUUID = $(event.currentTarget.parentElement.parentElement.parentElement.parentElement).find('div.o_list_view').prop('id');
  5.     var rpc = odoo.__DEBUG__.services['web.rpc'];
  6.     rpc.query({
  7.         model: modelName,
  8.         method: modelMethod,
  9.         args: [JSON.parse(window.sessionStorage.getItem(dataUUID) || '{}')]
  10.     }).then(function (res) {
  11.         if (res == true) {
  12.             wizard_dialog.css('display', 'none');
  13.             window.sessionStorage.removeItem(dataUUID);
  14.         } else {
  15.             $("button[name='action_confirm']").attr("disabled", false);
  16.         }
  17.     }).catch(function (err) {
  18.         $("button[name='action_confirm']").attr("disabled", false);
  19.     });
  20. }
复制代码
来源:https://www.cnblogs.com/shouke/p/17094265.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具