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

Odoo16中打开记录表单视图时触发自定义函数的方法

解决方案

方法一:前端JavaScript监听表单记录加载事件

Odoo表单视图每次加载新记录时会触发record_loaded事件,通过继承表单控制器组件监听该事件,可精准获取当前记录数据并执行自定义逻辑,覆盖从列表打开记录、切换上下条记录等所有场景,是最可靠的方案。

  1. 创建自定义JS文件(例如static/src/js/form_custom_handler.js):
odoo.define('your_module.form_custom_handler', function (require) {
    "use strict";

    const FormController = require('web.FormController');

    FormController.include({
        _onRecordLoaded: function (ev) {
            this._super.apply(this, arguments);
            // 获取当前记录的原始数据
            const record = this.model.get(this.handle, {raw: true});
            // 执行自定义逻辑
            this._executeCustomLogic(record);
        },

        _executeCustomLogic: function (record) {
            // 提取记录ID和字段值示例
            const recordId = record.res_id;
            const targetFieldValue = record.data.your_target_field;
            
            console.log('当前记录ID:', recordId, '目标字段值:', targetFieldValue);
            
            // 如需调用后端方法,使用_rpc发起请求
            this._rpc({
                model: 'your.model.name',
                method: 'your_backend_function',
                args: [recordId], // 可传递记录ID或其他数据
            }).then(result => {
                // 处理后端返回结果
                console.log('后端处理结果:', result);
            });
        }
    });

    return FormController;
});
  1. 在模块的__manifest__.py中引入该JS文件:
'assets': {
    'web.assets_backend': [
        'your_module/static/src/js/form_custom_handler.js',
    ],
},

方法二:后端Python结合前端触发(适合需后端处理的场景)

如果自定义逻辑必须在后端执行,除了上述JS调用后端方法的方式,还可以通过表单视图的on_load钩子触发:

  1. 在表单视图XML中添加on_load属性:
<record id="your_model_form_view" model="ir.ui.view">
    <field name="name">your.model.form.view</field>
    <field name="model">your.model.name</field>
    <field name="arch" type="xml">
        <form string="Your Form" on_load="on_form_load">
            <!-- 表单字段定义 -->
        </form>
    </field>
</record>
  1. 编写JS文件实现on_form_load函数:
odoo.define('your_module.form_on_load', function (require) {
    "use strict";

    const core = require('web.core');

    core.bus.on('web_action_manager_do_action', null, function (action) {
        if (action.xml_id === 'your_module.your_model_form_view') {
            const recordId = action.context.active_id;
            if (recordId) {
                // 调用后端自定义方法
                this._rpc({
                    model: 'your.model.name',
                    method: 'your_backend_function',
                    args: [recordId],
                }).then(result => {
                    // 处理结果
                    console.log(result);
                });
            }
        }
    });
});
  1. 同样在__manifest__.py中引入该JS文件。

注意事项

  • 避免使用_get_view方法:该方法仅在视图首次加载或页面刷新时触发,无法响应记录切换操作。
  • 后端方法需确保权限:如果后端方法涉及敏感操作,需添加权限控制,避免越权访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 19:42:51