Odoo tree列表查询或显示结果只有一条记录时自动点击跳转到form表单
需求: 查询结果是一条记录或者模块是一条记录时默认显示form表单详情页。
经过查找在Odoo应用市场找到Show Form View If Search Result Is One模块。
https://apps.odoo.com/apps/modules/15.0/show_form_view_after_search/
微调适配
下载后在\static\src\js
目录下找到AbstractController.js
文件,内容如下:
odoo.define('show_form_view_after_search.AbstractController', function (require) {
"use strict";
var AbstractController = require('web.AbstractController');
var includeDict = {
reload: async function (params) {
var res = await this._super.apply(this, arguments);
// 判断只有是看板视图或者列表视图进行后续操作
if (this.viewType === "kanban" || this.viewType === "list"){
//if (this.renderer.state !== undefined && this.renderer.state.count === 1 && this.modelName === "product.template") {
if (this.renderer.state !== undefined && this.renderer.state.count === 1) {
var $o_record = this.renderer.$el.find('.o_data_row,.o_kanban_record').not( ".o_kanban_ghost" );
// 判断记录只有一条时,触发点击事件进入form表单页
if ($o_record.length === 1) {
$o_record.trigger("click");
}
}
}
return res;
},
};
AbstractController.include(includeDict);
});
将AbstractController.js
文件复制到项模块的\static\src\js
下,然后在view
文件夹下创建templates.xml
填入下面内容引用该js文件:
<odoo>
<data>
<template id="assets_backend" inherit_id="web.assets_backend" name="odoo_test_assets_backend">
<xpath expr="." position="inside">
<script type="text/javascript" charset="utf-8" src="/bi_sip/static/src/js/one_record_show_form.js"/>
</xpath>
</template>
</data>
</odoo>
注:需要在__manifest__.py
内配置templates.xml
现在重启升级就可以进行测试了,当模块下数据只有一条或者查询结果只有一条时,会自动点击进入详情form表单页。
增加模块判断
往往这种需求只针对特殊模块或者某些模块,这时候只需要添加模块判断即可,修改后代码如下:
odoo.define('show_form_view_after_search.AbstractController', function (require) {
"use strict";
var AbstractController = require('web.AbstractController');
var includeDict = {
reload: async function (params) {
var res = await this._super.apply(this, arguments);
// 判断模块名称是指定模块或者在某些模块内,再进行后续操作
// if (['odoo_test.my_model_1', 'odoo_test.my_model_2', 'odoo_test.my_model_3'].includes(this.modelName)) {
if (this.modelName === 'odoo_test.my_model') {
// 判断只有是看板视图或者列表视图进行后续操作
if (this.viewType === "kanban" || this.viewType === "list"){
//if (this.renderer.state !== undefined && this.renderer.state.count === 1 && this.modelName === "product.template") {
if (this.renderer.state !== undefined && this.renderer.state.count === 1) {
var $o_record = this.renderer.$el.find('.o_data_row,.o_kanban_record').not( ".o_kanban_ghost" );
// 判断记录只有一条时,触发点击事件进入form表单页
if ($o_record.length === 1) {
$o_record.trigger("click");
}
}
}
}
return res;
},
};
AbstractController.include(includeDict);
});
结语
经过上述配置,就可以自由控制哪些model调用此js,同时了解如何在视图中引入自定义js文件。