如何在Odoo11的JS文件中调用Python函数?代码无效求助
在Odoo中从JS调用Python函数的正确方法
我来帮你搞定这个问题~你之前的代码没生效,核心原因是JS端缺少了关键的RPC请求逻辑,没有正确发起对Python方法的调用。下面给你拆解解决方案,附上完整的代码示例:
一、确认Python端方法的正确性
你的Python代码框架没问题,@api.model装饰器已经把方法声明为模型级公共方法,能被外部调用。这里给你稍微规范下类名(更符合Odoo的命名习惯),不影响功能只是更易维护:
from odoo import models, fields, api class MessageOfTheDay(models.Model): _name = "oepetstore.message_of_the_day" @api.model def my_method(self): # 返回你需要的消息数据 return {"hello": "world"} message = fields.Text() color = fields.Char(size=20)
二、JS端实现RPC调用
Odoo的前后端交互依赖内置的rpc模块,你需要引入它并发起请求。下面是完整的JS代码示例:
odoo.define('petstore.petstore', function (require) { "use strict"; // 引入需要的模块:Widget是基础组件,rpc用于发起后端请求 var Widget = require('web.Widget'); var rpc = require('web.rpc'); // 自定义一个Widget组件,在合适的生命周期(比如start)里调用Python方法 var PetstoreWidget = Widget.extend({ start: function () { // 发起RPC请求调用Python方法 rpc.query({ model: 'oepetstore.message_of_the_day', // 必须和Python端的_model完全一致 method: 'my_method', // 要调用的Python方法名 args: [], // @api.model方法不需要传记录ID,所以args是空数组 // 如果需要传参数,可以写成args: [param1, param2] }) .then(function (result) { // 请求成功后的处理:result就是Python方法返回的字典 console.log('从Python获取到的数据:', result); // 举个例子:把结果渲染到页面上 this.$el.html(`<p>获取到的消息:${result.hello}</p>`); }.bind(this)) .catch(function (error) { // 请求失败的错误处理,方便调试 console.error('调用Python方法出错:', error); }); return this._super.apply(this, arguments); }, }); // 返回组件,方便在其他地方使用或注册 return PetstoreWidget; });
三、关键注意事项
- 模型名称必须完全匹配:JS里的
model参数要和Python端_name的值一模一样,大小写、下划线都不能错。 - 方法权限检查:当前登录用户需要有
oepetstore.message_of_the_day模型的访问权限,否则会返回权限错误。可以在Odoo的权限设置里给对应用户组添加该模型的权限。 - 方法类型对应:如果你的Python方法是
@api.multi(针对具体记录的方法),那么args需要传记录ID数组,比如args: [1, 2];如果是@api.model(模型级方法),args为空数组即可。 - 错误处理不能少:加上
catch块能帮你快速定位问题,比如网络错误、方法不存在、权限不足等。
四、测试验证
部署修改后的代码后,打开对应的页面,打开浏览器控制台(F12),如果看到控制台打印出从Python获取到的数据: {hello: "world"},同时页面上显示对应的消息,就说明调用成功啦~
内容的提问来源于stack exchange,提问作者user_123
相关产品推荐
相关产品推荐

