Odoo 12自定义模块关联字段创建编辑弹窗改当前窗口需求
在Odoo 12中修改关联字段「创建并编辑」的打开方式
当然可行!你可以通过继承并修改Odoo自带的many2many_tags组件的JavaScript逻辑,把默认的弹窗改成在当前窗口或表单内打开创建视图。下面是具体的实现步骤:
1. 创建自定义JavaScript文件
在你的模块中新建一个JS文件(比如static/src/js/many2many_tags_custom.js),继承原有的Many2ManyTags组件并重写_searchCreatePopup方法:
odoo.define('your_module_name.many2many_tags_custom', function(require) { "use strict"; var Many2ManyTags = require('web.Many2ManyTags'); var core = require('web.core'); var _t = core._t; Many2ManyTags.include({ _searchCreatePopup: function (view, ids, context) { // 只针对「创建并编辑」操作修改逻辑 if (view === 'create') { var self = this; // 调用do_action打开表单视图,替代弹窗 this.do_action({ type: 'ir.actions.act_window', res_model: this.field.relation, // 关联模型(这里是survey.question) views: [[false, 'form']], // 直接打开表单视图 context: _.extend({}, this.record.getContext(this.recordParams), context || {}, { // 传递默认关联值,对应你的page_id上下文 default_page_id: this.record.data.id } ), target: 'current', // 在当前窗口打开(替换现有视图) // 如果想在当前表单内嵌入打开,可改为target: 'inline' flags: { form: { action_buttons: true, save_and_close: true // 保存后自动关闭返回原表单 } } }, { // 创建表单关闭后,刷新当前字段数据 on_close: function () { self.reload(); } }); } else { // 搜索操作保留原有的弹窗逻辑 return this._super.apply(this, arguments); } }, }); return Many2ManyTags; });
2. 在模块配置中加载JS文件
修改模块的__manifest__.py,把刚才的JS文件添加到后端资源中:
{ # ... 其他配置项 ... 'assets': { 'web.assets_backend': [ 'your_module_name/static/src/js/many2many_tags_custom.js', ], }, }
3. 验证效果
重启Odoo服务并升级你的模块后,再点击question_ids字段的「创建并编辑」按钮,就会在当前窗口打开问卷问题的创建表单,保存后会自动返回原问卷表单并刷新关联字段的数据。
关键说明
- 我们通过
include方法继承原组件,只修改创建操作的逻辑,保留了搜索操作的原有弹窗行为。 target: 'current'会让创建表单在当前视图容器中打开,替代原有的问卷视图;如果希望在原表单内嵌入打开(不跳转视图),可以改为target: 'inline'(需要视图支持内嵌表单)。- 上下文里的
default_page_id确保创建的问题自动关联到当前页面,和你原来视图中设置的context="{'page_id': active_id}"对应。
内容的提问来源于stack exchange,提问作者sss




