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

Odoo 13中通过自定义JS为弹窗添加供应商过滤器的问题(扩展relational_fields.js)

Odoo 13中通过自定义JS为弹窗添加供应商过滤器的问题(扩展relational_fields.js)

看起来你已经找对了要修改的核心方法_manageSearchMore,直接改原生文件能生效说明逻辑完全没问题!问题出在你只定义了扩展后的CustomFieldMany2One类,但没有告诉Odoo要使用这个自定义类来替换原生的FieldMany2One组件,所以你的代码根本没被实际调用到。

下面一步步帮你解决这个问题:

一、修改自定义JS文件,添加组件注册逻辑

Odoo的Web字段组件需要通过字段注册表field_registry来注册,让系统知道用你的自定义类替换原生的many2one字段。修改后的完整JS代码如下:

odoo.define('your_module_name.custom_relational_fields', function (require) {
    "use strict";

    var relational_fields = require('web.relational_fields');
    var FieldMany2One = relational_fields.FieldMany2One;
    var field_registry = require('web.field_registry'); // 引入字段注册表

    var CustomFieldMany2One = FieldMany2One.extend({
        _manageSearchMore: function (values, search_val, domain, context) {
            values = values.slice(0, this.limit);
            values.push({
                label: _t("Search More..."),
                action: function () {
                    var prom;
                    if (context.res_partner_search_mode === 'supplier') {
                        domain = domain.concat([['supplier_rank', '>', 0]]);
                    }
                    if (search_val !== '') {
                        prom = this._rpc({
                            model: this.field.relation,
                            method: 'name_search',
                            kwargs: {
                                name: search_val,
                                args: domain,
                                operator: "ilike",
                                limit: this.SEARCH_MORE_LIMIT,
                                context: context,
                            },
                        });
                    }
                    Promise.resolve(prom).then(function (results) {
                        var dynamicFilters;
                        if (results) {
                            var ids = _.map(results, function (x) {
                                return x[0];
                            });
                            dynamicFilters = [{
                                description: _.str.sprintf(_t('Quick search: %s'), search_val),
                                domain: [['id', 'in', ids]],
                            }];
                            if (context.res_partner_search_mode === 'supplier') {
                                dynamicFilters = [{
                                    description: _.str.sprintf(_t('Quick search: %s, Vendors'), search_val),
                                    domain: [['id', 'in', ids], ['supplier_rank', '>', 0]],
                                }];
                            }
                        }
                        this._searchCreatePopup("search", false, {}, dynamicFilters);
                    }.bind(this));
                }.bind(this),
                classname: 'o_m2o_dropdown_option',
            });
            return values;
        },
    });

    // 关键:将自定义类注册到字段注册表,替换原生的many2one字段
    field_registry.add('many2one', CustomFieldMany2One);

    return {
        CustomFieldMany2One: CustomFieldMany2One,
    };
});

二、确保资产正确加载

你有两种方式加载自定义JS,选一种即可,不要同时使用:

方式1:通过manifest的assets配置

取消manifest里assets部分的注释,注意替换成你的模块名:

{
    "name": "my module name| Purchase enhancement",
    "summary": "Apply changes to core Odoo purchasing module to adapt changes to the customer requirement.",
    "license": "LGPL-3",
    "author": "much. GmbH",
    "auto_install": false,
    "application": false,
    "sequence": 100,
    "category": "Purchase",
    "version": "13.0.6.26.0",
    "depends": ["base", "product", "purchase", "purchase_stock", "web"],
    "data": [
        "views/purchase_order.xml",
        "views/product_views.xml",
        "views/res_partner_views.xml",
        "views/stock_picking_view.xml",
        "wizard/display_dialog_box.xml",
        "data/ir_config_parameter_data.xml"
        // 用manifest的assets时,移除data里的assets.xml
    ],
    "assets": {
         "web.assets_backend": [
             "my_module/static/src/js/custom_relational_fields.js",
         ],
     }
}

方式2:通过assets.xml

如果用这种方式,确保assets.xml在data列表里,路径正确:

<odoo>
    <template id="assets_backend" name="custom assets" inherit_id="web.assets_backend">
        <xpath expr="." position="inside">
            <script type="text/javascript" src="/my_module/static/src/js/custom_relational_fields.js"></script>
        </xpath>
    </template>
</odoo>

三、清除缓存,测试效果

Odoo的资产缓存和浏览器缓存经常会导致修改不生效,务必做以下操作:

  • 在Odoo后台,进入设置 -> 技术 -> 外观 -> 资产,点击"刷新资产"按钮
  • 用快捷键Ctrl+Shift+R强制刷新浏览器缓存
  • 如果是开发模式,建议启动Odoo时加上--dev=all参数,自动重载修改的文件

额外说明

你的逻辑是通过context.res_partner_search_mode === 'supplier'判断是否添加过滤器,这个上下文是采购模块的供应商字段自动传递的,只要注册了自定义类,在报价单的供应商字段点击"Search More..."就会自动带上供应商过滤器了。

备注:内容来源于stack exchange,提问作者MrWater

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 03:19:58