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

如何在Odoo 15中覆写core.action_registry中的JS函数update_attendance

问题:覆写Odoo hr_attendance模块的update_attendance函数无效

hr_attendance模块在core.action_registry中注册了抽象动作hr_attendance_my_attendances,其中包含update_attendance函数,尝试覆写该函数但未生效。参考示例时发现core.action_registry没有extend方法,当前模块的my_attendances.js代码如下:

odoo.define('my_module.my_attendances', function (require) {
    "use strict";
    
    const session = require('web.session');
    var core = require('web.core');
    var MyAttendances = require('hr_attendance.my_attendances');

    var MyAttendancesExtended = MyAttendances.extend({

        // events: _.extend({
        //     'click .o_hr_attendance_sign_in_out_icon': 'update_attendance',
        // }, AbstractField.prototype.events),

        update_attendance: function () {
            console.log('I HAVE OVERWRITTEN THE FUNCTION');
            var self = this;
            this._rpc({
                model: 'hr.employee',
                method: 'attendance_manual',
                args: [[self.employee.id], 'hr_attendance.hr_attendance_action_my_attendances', None],
                context: session.user_context,
            })
            .then(function(result) {
                if (result.action) {
                    self.do_action(result.action);
                } else if (result.warning) {
                    self.displayNotification({ title: result.warning, type: 'danger' });
                }
            });
        },
    });
    
    core.action_registry.add('my_module.my_attendances', MyAttendancesExtended);
    
    return MyAttendancesExtended;

});

已将JS文件添加至__manifest__.py,但控制台看不到日志输出:

'assets': {
    'web.assets_backend': [
        'my_module/static/src/js/my_attendance.js',
    ],
},

解决思路
  • 替换原有动作注册项:当前代码是新增了一个自定义动作,但系统实际调用的还是原有的hr_attendance.my_attendances动作。需要先移除原动作的注册,再将扩展后的类重新注册到同一个动作名上:

    // 替换原有的动作注册代码
    core.action_registry.remove('hr_attendance.my_attendances');
    core.action_registry.add('hr_attendance.my_attendances', MyAttendancesExtended);
    
  • 修正JS文件名不一致问题:__manifest__.py中配置的文件名是my_attendance.js,但实际代码文件是my_attendances.js(多了一个s),这会导致文件无法加载,修正路径为:

    'assets': {
        'web.assets_backend': [
            'my_module/static/src/js/my_attendances.js',
        ],
    },
    
  • 修复JS语法错误:JavaScript中没有None关键字,需要替换为null,否则会导致函数执行报错:

    args: [[self.employee.id], 'hr_attendance.hr_attendance_action_my_attendances', null],
    
  • 确保加载Underscore(可选):如果需要扩展事件,要确保引入Underscore工具库,在代码顶部添加:

    var _ = require('web.utils')._;
    

    若只是覆写方法,无需重写events,原类的事件绑定会自动继承。

  • 清除缓存并更新模块:修改静态资源后,需强制刷新浏览器缓存(Ctrl+Shift+R),同时重启Odoo服务并更新模块(执行./odoo-bin -u my_module),确保新代码生效。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:35:21