You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动