Odoo-11:无需return语句弹出表单视图的实现方案
在Odoo 11中无需return实现表单弹窗并继续执行代码
嘿,我懂你遇到的痛点——用return弹窗的话,后续代码直接就断了,单独抽个弹窗方法调用又没效果,对吧?这是因为Odoo的按钮逻辑里,只有把action字典通过return返回给客户端,才会触发视图弹窗;内部调用方法返回的action根本传不到客户端,自然不会生效。
下面给你两种靠谱的解决方案,都能实现弹窗后继续跑后端代码:
方法一:用self.env.user.do_action()主动触发弹窗
这是最直接的方式,你可以在Python代码里主动给客户端发弹窗指令,不用依赖return,后续代码能正常执行。
示例代码如下:
@api.multi def your_main_button_method(self): # 第一步:准备弹窗的action配置 # 如果你要打开已有记录的表单,先获取目标记录 target_record = self.env['your.target.model'].browse(123) # 替换成你的目标记录ID或查询逻辑 # 构建弹窗所需的action字典 popup_action = { 'name': '你的弹窗标题', 'type': 'ir.actions.act_window', 'res_model': 'your.target.model', # 要打开的模型名称 'res_id': target_record.id, # 要打开的记录ID,新建记录就设为False 'view_mode': 'form', 'view_type': 'form', 'target': 'new', # 指定弹窗模式 'context': self.env.context, # 传递当前上下文 } # 触发弹窗:调用do_action让客户端执行这个action self.env.user.do_action(popup_action) # 这里就可以写弹窗后要执行的代码了 self.write({'state': 'in_process'}) # 示例:更新当前记录状态 # 更多业务逻辑...
方法二:引用已定义的窗口动作(如果有)
如果你已经通过XML在系统里定义了ir.actions.act_window记录,可以直接引用它,不用手动构建action字典:
@api.multi def your_main_button_method(self): # 引用已有的action(替换成你的action外部ID) existing_action = self.env.ref('your_module.your_action_external_id') # 调整action参数(比如指定要打开的记录ID) action = existing_action.read()[0] action['res_id'] = self.env['your.target.model'].browse(123).id action['target'] = 'new' # 触发弹窗 self.env.user.do_action(action) # 后续执行其他操作 # ...
为什么之前的第二个方法没生效?
你之前单独写弹窗方法并调用,本质上只是在后端跑了一遍方法,返回的action字典根本没传递给客户端——Odoo客户端只会处理按钮方法直接return的action,内部调用方法返回的action会被直接丢弃,所以自然不会触发弹窗。而do_action方法是主动把action指令发送给客户端,所以能正常触发弹窗。
内容的提问来源于stack exchange,提问作者LALMI Mohamed Lamine




