You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:21:19