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

如何在Odoo的res.partner表单视图仅加载指定JS/CSS文件?

没问题,这个需求完全可以实现!在Odoo里要针对特定视图(比如base.view_partner_form)加载JS/CSS,核心思路是要么把资源绑定到目标视图的专属资产上,要么在脚本里判断当前视图再执行逻辑。下面给你两种靠谱的实现方式:

方法一:通过视图绑定专属资产(推荐)

这种方式能真正做到仅在打开目标视图时才加载资源,性能更优,是官方推荐的做法:

  1. 先创建一个仅用于伙伴表单的资产模板
    在你的模块XML文件中定义专属资产,替代之前全局引入的方式:
<odoo>
    <data>
        <!-- 定义仅用于伙伴表单的资产模板 -->
        <template id="partner_form_assets" name="Partner Form Assets" inherit_id="web.assets_backend">
            <xpath expr="." position="inside">
                <script type="text/javascript" src="/my_module/static/src/js/script.js"></script>
                <!-- 如果需要加载CSS,也可以在这里添加 -->
                <!-- <link rel="stylesheet" href="/my_module/static/src/css/style.css"/> -->
            </xpath>
        </template>
    </data>
</odoo>
  1. 继承伙伴表单视图,绑定专属资产
    接下来修改base.view_partner_form视图,给它指定上面创建的资产模板:
<odoo>
    <data>
        <!-- 继承伙伴表单视图,绑定专属资产 -->
        <record id="view_partner_form_inherit" model="ir.ui.view">
            <field name="name">res.partner.form.inherit</field>
            <field name="model">res.partner</field>
            <field name="inherit_id" ref="base.view_partner_form"/>
            <field name="assets_id" ref="my_module.partner_form_assets"/>
        </record>
    </data>
</odoo>

这样配置后,只有当用户打开伙伴表单视图时,Odoo才会加载这个资产模板里的JS/CSS,其他视图完全不会加载这些资源。

方法二:在JS中判断视图ID执行逻辑

如果不想修改视图配置,也可以采用“全局加载脚本,但仅在目标视图下执行逻辑”的方式,适合快速测试或无法修改视图的场景:

修改你的script.js文件,加入视图判断逻辑:

odoo.define('my_module.partner_script', function (require) {
    "use strict";

    var FormController = require('web.FormController');
    var viewRegistry = require('web.view_registry');

    // 继承表单控制器,在初始化时检查视图ID
    var PartnerFormController = FormController.extend({
        init: function (parent, model, renderer, params) {
            this._super.apply(this, arguments);
            // 检查当前视图是否是目标伙伴表单视图
            if (params.viewId === 'base.view_partner_form') {
                // 在这里执行你的专属业务逻辑
                this._runPartnerCustomLogic();
            }
        },

        _runPartnerCustomLogic: function () {
            // 示例:打印日志,替换成你的实际逻辑
            console.log('仅在伙伴表单视图执行的脚本启动了!');
            // 比如绑定表单事件、修改字段行为等
        }
    });

    // 注册修改后的控制器到表单视图
    viewRegistry.add('form', PartnerFormController);

    return PartnerFormController;
});

这种方式下,脚本还是会被全局加载,但只有在检测到当前视图是base.view_partner_form时,才会执行你的专属逻辑。

注意事项
  • 方法一的性能更优,推荐优先使用;
  • 无论用哪种方式,更新模块后都要升级应用,并清除浏览器缓存(Ctrl+Shift+R)才能看到效果;
  • 如果你的JS需要操作视图元素,确保在视图渲染完成后执行(方法二中的init阶段适合初始化逻辑,若要操作DOM可考虑rendered钩子)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:57:10