Odoo16中打开记录表单视图时触发自定义函数的方法
解决方案
方法一:前端JavaScript监听表单记录加载事件
Odoo表单视图每次加载新记录时会触发record_loaded事件,通过继承表单控制器组件监听该事件,可精准获取当前记录数据并执行自定义逻辑,覆盖从列表打开记录、切换上下条记录等所有场景,是最可靠的方案。
- 创建自定义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; });
- 在模块的
__manifest__.py中引入该JS文件:
'assets': { 'web.assets_backend': [ 'your_module/static/src/js/form_custom_handler.js', ], },
方法二:后端Python结合前端触发(适合需后端处理的场景)
如果自定义逻辑必须在后端执行,除了上述JS调用后端方法的方式,还可以通过表单视图的on_load钩子触发:
- 在表单视图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>
- 编写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); }); } } }); });
- 同样在
__manifest__.py中引入该JS文件。
注意事项
- 避免使用
_get_view方法:该方法仅在视图首次加载或页面刷新时触发,无法响应记录切换操作。 - 后端方法需确保权限:如果后端方法涉及敏感操作,需添加权限控制,避免越权访问。
内容的提问来源于stack exchange,提问作者Neural
相关产品推荐
相关产品推荐

