如何通过Odoo JS实现点击产品打开并填充产品表单视图
解决Odoo点击产品打开表单但无法填充字段的问题
看起来你已经搞定了打开表单视图的部分,但字段自动填充没生效对吧?核心问题是你的代码里没告诉Odoo要把哪些数据塞进表单里,我给你两种场景的解决方案,你按需选:
场景1:打开现有产品的表单(直接展示该产品的所有字段)
如果点击的是已有产品,你只需要在do_action里指定该产品的res_id,Odoo就会自动加载对应记录的所有字段,不需要手动填。修正后的代码如下:
selected_item: function(e){ e.preventDefault(); // 从点击元素的data属性获取产品ID const productId = $(e.currentTarget).data('id'); return this.do_action({ type: 'ir.actions.act_window', res_model: 'product.product', res_id: productId, // 关键:指定要打开的产品记录ID view_type: 'form', view_mode: 'form', target: 'current', // 可选:'current'替换当前视图,'new'打开新窗口 flags: { form: { options: {'mode': 'view'} // 可选:'view'只读,'edit'默认可编辑 } } }); }
场景2:新建产品并预填充字段
如果是要基于点击的产品数据新建一条记录,那得通过context传递default_前缀的字段值,告诉Odoo预填充哪些内容。这里需要先读取原产品的字段数据,再传递给新表单:
selected_item: function(e){ e.preventDefault(); const productId = $(e.currentTarget).data('id'); // 先调用后端获取原产品的字段数据(按需指定你要填充的字段) this._rpc({ model: 'product.product', method: 'read', args: [[productId], ['name', 'default_code', 'list_price', 'categ_id']], }).then(productData => { return this.do_action({ type: 'ir.actions.act_window', res_model: 'product.product', view_type: 'form', view_mode: 'form', target: 'new', context: { // 用default_+字段名的格式传递预填充值 default_name: productData[0].name, default_default_code: productData[0].default_code, default_list_price: productData[0].list_price, default_categ_id: productData[0].categ_id, // 其他需要填充的字段同理添加 }, }); }); }
为啥原代码没生效?
你的原始代码只告诉Odoo要打开product.product的表单,但没指定要加载哪条现有记录,也没传递新建时要预填充的字段值,所以Odoo只能打开一个空白的新建表单,自然不会自动填充任何内容。
另外要注意:确保你点击的元素上确实正确绑定了data-id属性,且值是有效的产品ID;如果用_rpc读取数据,要确认你有权限访问该产品记录,以及指定的字段名和product.product模型的字段完全匹配。
内容的提问来源于stack exchange,提问作者user_123
相关产品推荐
相关产品推荐

