Odoo开发:如何通过wizard按钮修改模型表单的statusbar状态
Odoo Wizard提交绑定同步主单状态栏状态实现方案
核心实现逻辑
整个流程不需要额外编写前端JS逻辑,仅通过后端代码即可完成「点击提交→更新主单状态→自动关闭弹窗→刷新主单显示」的全链路操作。
具体开发步骤
1. 前置模型关联配置
首先在wizard模型中新增关联主业务单据的外键字段,用于定位需要更新状态的主表记录:
from odoo import models, fields class SubmitWizard(models.TransientModel): _name = 'your.module.submit.wizard' _description = '提交确认向导' main_record_id = fields.Many2one( comodel_name='your.main.business.model', string="关联主单据", required=True )
2. 编写提交按钮绑定的后端方法
在wizard模型中新增action_submit方法,直接绑定到wizard表单上的提交按钮即可:
def action_submit(self): # 定位需要更新状态的主单记录 target_record = self.main_record_id # 优先复用主单原有状态切换的封装方法,避免业务逻辑重复、遗漏校验 target_record.action_existing_submit() # 触发弹窗自动关闭,底层会自动刷新背后的主表单数据 return {'type': 'ir.actions.act_window_close'}
3. 配置主单端打开wizard的入口方法
在主业务模型中新增打开wizard的动作,确保打开wizard时自动填充关联主单的id,避免wizard找不到关联记录:
def action_open_submit_wizard(self): return { 'type': 'ir.actions.act_window', 'name': '提交确认向导', 'res_model': 'your.module.submit.wizard', 'view_mode': 'form', 'target': 'new', 'context': { 'default_main_record_id': self.id } }
实操注意事项
- 禁止绕开原有状态切换方法直接对state字段做裸write操作,必须复用主单上已封装的状态切换逻辑,保证权限校验、字段规则、联动行为和原状态栏按钮完全一致。
- 提交动作返回
ir.actions.act_window_close时,需确保wizard以target: new的弹窗模式打开,该模式下Odoo会自动在弹窗关闭后触发父级主表单的数据重载,无需额外编写手动刷新的JS代码。 - 状态字段赋值需和主表单statusbar组件关联的selection选项技术值完全匹配,避免出现字段值写入但状态栏显示异常的问题。
内容的提问来源于stack exchange,提问作者kntd
相关产品推荐
相关产品推荐

