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

Odoo 10中继承并修改POS模块JavaScript函数的技术问询

继承并修改Odoo 10 POS模块的Orderline set_quantity函数

嘿,要修改Odoo 10 POS里models.js中Orderline模型的set_quantity函数,完全不用碰核心代码,用自定义模块做非侵入式继承就搞定了,下面给你一步步拆解操作:

1. 先搭好自定义模块的基础架子

你得先建一个自定义模块,结构大概是这样:

your_custom_pos_module/
├── __init__.py
├── __manifest__.py
├── static/
│   └── src/
│       └── js/
│           └── pos_custom.js

__init__.py可以是空文件,主要是让Python识别这是个合法模块。

2. 写继承修改的JS代码

在pos_custom.js里,用Odoo POS自带的继承方式来改写set_quantity函数,有两种常见写法:

写法一:部分重写(保留原逻辑+加自定义代码)

如果你想在原函数的基础上加点自己的逻辑,比如先打个自定义日志,再执行原逻辑,之后再加额外操作:

odoo.define('your_custom_pos_module.pos_custom', function(require) {
    "use strict";

    var models = require('point_of_sale.models');

    // 继承Orderline模型
    models.Orderline = models.Orderline.extend({
        set_quantity: function(quantity){
            // 先打印自己的自定义日志
            console.log('自定义提示:修改数量触发啦,当前传入数量是', quantity);
            
            // 调用原函数的逻辑,要是不想保留原逻辑就删掉这行
            this._super(quantity);

            // 加自己的自定义逻辑,比如数量超过10时触发提示
            if (parseFloat(quantity) > 10) {
                console.log('数量超10了哦!');
                // 这里还能加弹窗或者其他POS交互,比如调用POS的提示组件
            }
        },
    });

    return models;
});

写法二:先执行原逻辑再补代码

要是你想原函数逻辑跑完之后再做自己的操作,也可以这样写:

odoo.define('your_custom_pos_module.pos_custom', function(require) {
    "use strict";

    var models = require('point_of_sale.models');
    // 先存下原函数的引用,避免覆盖后找不到
    var original_set_quantity = models.Orderline.prototype.set_quantity;

    models.Orderline = models.Orderline.extend({
        set_quantity: function(quantity){
            // 先执行原函数的所有逻辑,用call绑定正确的上下文
            original_set_quantity.call(this, quantity);
            
            // 原逻辑跑完后,加自己的操作
            console.log('当前订单行的最终数量是', this.quantity);
            // 这里写你的其他自定义代码
        },
    });

    return models;
});

3. 配置模块让JS加载生效

在__manifest__.py里,要告诉Odoo加载我们的自定义JS文件,配置大概是这样:

{
    'name': 'POS自定义修改',
    'version': '1.0',
    'depends': ['point_of_sale'],  # 依赖POS核心模块,确保加载顺序正确
    'data': [],
    'qweb': [],
    'assets': {
        'point_of_sale.assets': [
            'your_custom_pos_module/static/src/js/pos_custom.js',
        ],
    },
    'installable': True,
    'auto_install': False,
}

4. 安装模块测试

把这个模块放到Odoo的addons目录下,更新模块列表,安装这个自定义模块,然后打开POS界面,修改订单行的数量,打开浏览器控制台(F12)就能看到我们的自定义日志,确认逻辑生效啦!

几个关键注意事项

  • 绝对不要直接修改Odoo核心模块的代码,不然以后升级版本会非常麻烦,继承才是最佳实践。
  • 调用原函数的时候,要确保this的上下文正确,用_super或者call来绑定就行。
  • Odoo 10的POS基于Backbone.js开发,所以继承规则跟Backbone的模型继承完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:36:47