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

Odoo 16中如何在action_service.js中补丁/引入自定义代码

Odoo 16 自定义report_type不生效+JS补丁报错解决指南

问题背景

  • 基于Odoo 16开发,自定义的action.report_type未被系统识别,需扩展_executeReportAction函数添加适配逻辑
  • 已创建自定义模块,JS文件放置路径为mycustom_module/static/src/js,但使用patch/include方法均无效果,代码中console语句无输出
  • 偶发报错:Error while loading mycustom_module.Receipt: WeakMap key must be an object, got obj TypeError: WeakMap key must be an object, got obj
  • 尝试ActionService.include方法仍触发错误

解决步骤

1. 确认前端资源注册正确

在模块的__manifest__.py中,确保JS文件已被添加到对应资产包:

'assets': {
    'web.assets_backend': [
        'mycustom_module/static/src/js/*.js',
    ],
},

若为POS场景,需替换为point_of_sale.assets资产包。

2. 修正补丁写法(解决WeakMap错误)

Odoo 16优先使用patch方法,include已逐步废弃。错误根源是补丁目标对象传入错误,正确写法如下:

import { patch } from '@web/core/utils/patch';
import { ActionService } from '@web/webclient/actions/action_service';

patch(ActionService.prototype, 'mycustom_module.patch_action_service', {
    async _executeReportAction(action, options) {
        // 保留原方法逻辑(可选)
        const originalResult = await this._super(...arguments);
        
        // 处理自定义report_type
        if (action.report_type === 'your_custom_type') {
            console.log('自定义报表类型触发');
            // 此处添加你的自定义处理逻辑
        }
        
        return originalResult;
    },
});

核心注意:必须针对类的原型对象(ActionService.prototype)进行patch,而非类本身。

3. 强制刷新资源与缓存

修改JS后必须执行以下操作:

  • 强制刷新浏览器缓存(Ctrl+Shift+R)
  • 重启Odoo服务
  • 执行命令强制更新资产:
./odoo-bin -u mycustom_module --force-assets

4. 检查模块依赖配置

确保__manifest__.py中添加了必要依赖:

'depends': ['web'],

若为POS模块,需添加point_of_sale依赖。

5. 调试验证

  • 在JS文件开头添加console.log('自定义JS已加载');,确认文件是否被正确加载
  • 使用浏览器开发者工具的Sources面板,定位到你的JS文件,设置断点验证逻辑是否执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 10:43:33