Odoo 16树形视图JavaScript扩展未触发问题求助
Odoo 16保险管理模块JS行点击扩展失效问题
问题概述
开发Odoo 16保险管理模块时,需求为点击insurance.details视图内关联树形视图(claim_ids字段)的任意行,跳转至claim.details理赔详情页。当前JS脚本完全未触发(控制台无"Script called"日志),仅树形视图内的"View Details"按钮可正常跳转。
提供的代码片段
manifest.py
{ 'name': 'Insurance Management', 'version': '16.0.1.1.1', 'summary': """Insurance Management & Operations""", 'description': """Insurance Management""", 'author': 'Cybrosys Techno Solutions', 'company': 'Cybrosys Techno Solutions', 'website': 'https://www.cybrosys.com', 'category': 'Industries', 'depends': ['account', 'base', 'crm', 'web'], 'license': 'AGPL-3', 'data': [ 'security/ir.model.access.csv', 'data/insurance_management_data.xml', 'views/claim_details_views.xml', 'views/employee_details_views.xml', 'views/insurance_details_views.xml', 'views/policy_details_views.xml', 'views/insurance_management_menus.xml', 'views/crm_lead_views.xml' ], 'images': ['static/description/banner.png'], 'installable': True, 'application': True, 'auto_install': False, 'assets': { 'web.assets_backend': [ '/insurance_management_cybro/static/src/css/styles.css', '/insurance_management_cybro/static/src/js/list_controller.js' ] }, }
list_controller.js
odoo.define("insurance_management_cybro.list_controller", function (require) { "use strict"; console.log("Script called"); var ListController = require("web.ListController"); ListController.include({ _onRowClicked: function (event) { console.log("Row clicked", event); if (this.modelName === "insurance.details") { var action = { type: "ir.actions.act_window", view_type: "form", view_mode: "form", res_model: "claim.details", views: [[false, "form"]], target: "current", res_id: event.data.id, }; return this.do_action(action); } this._super.apply(this, arguments); }, }); });
insurance_details_views.xml
<page string="Claims"> <field name="claim_ids" id="add_claim" context="{'default_policy_number': policy_number, 'default_force_readonly': True}"> <tree create="true" delete="false" class="claims-in-insurance"> <button name="open_claim_action" string="View Details" type="object" class="oe_highlight"/> <field name="external_claim_number" optional="show"/> <field name="date_claimed" optional="show"/> <field name="claim_status" optional="show"/> <field name="cause_of_claim" optional="show" /> <field name="detailed_cause" optional="show" /> <field name="total_claim_amount" optional="show" /> </tree> </field> </page>
问题根源
- 模型判断错误:树形视图渲染的是
claim.details模型(关联字段claim_ids指向理赔记录),原代码中判断this.modelName === "insurance.details"永远不成立。 - JS资源加载异常:路径错误、模块未更新或浏览器缓存导致脚本未被注入。
- 行点击事件触发条件:Odoo 16中默认树形视图行可能需要额外配置才能触发点击事件。
解决方案
1. 修正JS模型判断逻辑
将模型判断改为claim.details,因为树形视图实际绑定的是理赔模型:
odoo.define("insurance_management_cybro.list_controller", function (require) { "use strict"; console.log("Script called"); var ListController = require("web.ListController"); ListController.include({ _onRowClicked: function (event) { console.log("Row clicked", event); // 修正为正确的模型名 if (this.modelName === "claim.details") { var action = { type: "ir.actions.act_window", view_type: "form", view_mode: "form", res_model: "claim.details", views: [[false, "form"]], target: "current", res_id: event.data.id, }; return this.do_action(action); } this._super.apply(this, arguments); }, }); });
2. 确保JS资源正确加载
- 核对
manifest.py中的资源路径与实际文件路径一致,注意大小写(Odoo对路径大小写敏感)。 - 重启Odoo服务并更新模块:执行命令
odoo-bin -u insurance_management_cybro。 - 强制刷新浏览器缓存(Ctrl+F5),避免旧资源干扰。
3. 配置树形视图允许行点击
在<tree>标签中添加editable="top"(即使不需要编辑,也能触发行点击事件):
<tree create="true" delete="false" class="claims-in-insurance" editable="top">
4. 验证脚本加载状态
打开浏览器开发者工具(F12),在Sources标签下检查list_controller.js是否已加载。若未加载,重新检查模块安装状态和资源路径。
内容的提问来源于stack exchange,提问作者Kamil Wolski
相关产品推荐
相关产品推荐

