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

ODOO14中JavaScript函数如何获取当前调用的模型与记录id?

实现方案

你拿不到参数的核心问题有两个:一是Promise内部this指向偏移,没有指向正确的视图上下文;二是从按钮元素的dataset拿模型是错误的,除非你主动在按钮XML上定义了对应data属性,否则该属性不存在。

推荐实现方式(从视图实例取值,稳定性最高)

Odoo的表单/列表视图控制器实例本身就自带当前上下文的模型、记录ID属性,直接读取即可,不需要解析URL:

// 外层提前存储正确的视图上下文,避免Promise内部this指向错误
const self = this;
const def = new Promise(function (resolve, reject) {
    // 读取当前模型名
    const currentModel = self.modelName;
    // 读取当前表单视图的单条记录ID
    const currentRecordId = self.res_id;
    // 列表视图选中多条的场景可以用下面的方法拿选中ID数组
    // const selectedIds = self.getSelectedIds();

    const call_kw = '/web/dataset/call_kw/my.module/my_func';  
    session.rpc(call_kw, {
        model: 'my.module',
        method: 'my_func',
        // 将模型、ID作为参数传给后端方法
        args: [currentModel, currentRecordId],
        kwargs: {}
    }).then(result => resolve(result))
    .catch(error => reject(error));
});

备选实现方式(解析URL Hash参数)

如果确实需要从URL取值,可以用下面的方法读取Hash中的参数,和你给出的示例URL匹配:

// 封装Hash参数读取方法
function getHashParam(paramName) {
    const hashParams = new URLSearchParams(window.location.hash.slice(1));
    return hashParams.get(paramName);
}

// 调用取值
const currentModel = getHashParam('model');
const currentRecordId = getHashParam('id');

注意事项

  • 该方案适用于Odoo 12及以上版本的视图控制器扩展场景
  • 如果是自定义注入的按钮,需要确保你的JS绑定方法的上下文是当前视图的控制器实例,才能正常读取modelName、res_id属性

内容的提问来源于stack exchange,提问作者Faheem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 00:18:03