如何解决Odoo12中向导的one2many字段自动弹出问题?
Odoo向导打印时one2many字段随机弹窗问题:已知Bug与修复方案
这是Odoo(13+版本居多)的已知前端交互Bug,核心原因是打印请求的异步处理和one2many字段的DOM事件存在竞态条件——两者的事件触发时机偶尔重叠,导致误触发子表单弹窗,概率性出现且无固定规律。
修复方案
1. 给打印按钮添加事件阻止属性
在向导的视图XML文件中,修改打印按钮的定义,添加prevent_default="1"来阻止默认事件冒泡,避免和one2many字段的点击/聚焦事件冲突:
<button name="action_print_payslip" string="打印" type="object" class="btn-primary" prevent_default="1"/>
2. 修改打印动作的响应逻辑,关闭向导
在向导的Python模型里,更新打印动作的返回值,加入close_on_report_download: True,让PDF下载完成后直接关闭向导,从根源切断后续的视图交互:
def action_print_payslip(self): # 保留你原有的PDF生成逻辑 # 示例:pdf = self.env.ref('your_module.report_payslip').render_qweb_pdf(self.ids)[0] return { 'type': 'ir.actions.report', 'report_type': 'pdf', 'report_name': 'your_module.report_payslip', 'data': {'model': self._name, 'ids': self.ids}, 'close_on_report_download': True, # 关键配置:下载后关闭向导 }
3. 临时规避:打印前将one2many设为只读
如果前两个方案暂时无法生效,可以在打印触发时临时把one2many字段设为只读,打印完成后恢复:
def action_print_payslip(self): # 临时设置one2many字段为只读 for rec in self: rec.write({ 'payslips': [(1, slip.id, {'readonly': True}) for slip in rec.payslips], 'employees': [(1, emp.id, {'readonly': True}) for emp in rec.employees], }) # 执行PDF生成 pdf_result = self.env.ref('your_module.report_payslip').render_qweb_pdf(self.ids) # 恢复字段可编辑状态 for rec in self: rec.write({ 'payslips': [(1, slip.id, {'readonly': False}) for slip in rec.payslips], 'employees': [(1, emp.id, {'readonly': False}) for emp in rec.employees], }) return { 'type': 'ir.actions.report', 'report_type': 'pdf', 'report_name': 'your_module.report_payslip', 'data': {'model': self._name, 'ids': self.ids}, }
补充说明
这个Bug在Odoo官方社区和企业版都有反馈,主要出现在异步打印场景下。优先推荐方案1+方案2组合使用,既能阻止事件误触发,又能通过关闭向导彻底避免后续交互冲突,效果最稳定。
内容的提问来源于stack exchange,提问作者Hrvoje J.
相关产品推荐
相关产品推荐

