You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Odoo15中通过Python代码调用确认弹窗并获取结果

解决Odoo15中Python触发确认弹窗并获取结果的方案

首先明确核心限制:Python后端运行在服务器环境,而确认弹窗是浏览器端的交互,无法直接在Python函数内同步触发并获取结果——这是前后端架构的本质特性。但可以通过「后端触发前端弹窗,用户操作后回调后端函数」的异步方式实现需求,无需依赖Wizard或XML按钮的confirm属性。

方案1:原生浏览器确认框+RPC回调后端

步骤1:定义触发弹窗与结果处理的Python函数

from odoo import models, api

class YourTargetModel(models.Model):
    _inherit = 'your.model.name'  # 替换为实际要扩展/使用的模型

    @api.model
    def trigger_confirm_popup(self, record_id):
        # 构造前端执行的JS代码,用户选择后通过RPC调用后端处理函数
        js_code = f"""
        if (confirm('确定要执行该操作吗?')) {{
            odoo.call('your.model.name.handle_confirm_result', {{
                record_id: {record_id},
                result: true
            }});
        }} else {{
            odoo.call('your.model.name.handle_confirm_result', {{
                record_id: {record_id},
                result: false
            }});
        }}
        """
        # 返回执行JS的客户端动作
        return {
            'type': 'ir.actions.client',
            'tag': 'javascript',
            'params': {'code': js_code}
        }

    @api.model
    def handle_confirm_result(self, record_id, result):
        # 这里编写基于用户选择的后续业务逻辑
        target_record = self.browse(record_id)
        if result:
            # 用户确认后的操作示例:修改记录状态
            target_record.write({'state': 'confirmed'})
        else:
            # 用户取消后的操作示例:记录日志或直接跳过
            pass

步骤2:在任意Python函数中触发弹窗

只需返回上述trigger_confirm_popup的动作结果,即可让前端弹出确认框:

@api.model
def your_business_function(self):
    # 执行业务逻辑前半部分
    # ...
    # 触发弹窗,传入当前操作的记录ID(按需调整)
    return self.trigger_confirm_popup(self.id)

方案2:Odoo风格弹窗(更美观)

如果需要和Odoo系统风格统一的弹窗,可替换为Odoo官方的Dialog组件:

步骤1:修改弹窗JS代码

将trigger_confirm_popup中的js_code替换为以下内容:

odoo.require('web.Dialog').then(function(Dialog) {
    new Dialog(this, {
        title: '操作确认',
        size: 'medium',
        $content: $('<p>确定要执行该操作吗?</p>'),
        buttons: [
            {
                text: '取消',
                close: true,
                click: function() {
                    odoo.call('your.model.name.handle_confirm_result', {{
                        record_id: {record_id},
                        result: false
                    }});
                }
            },
            {
                text: '确认',
                close: true,
                classes: 'btn-primary',
                click: function() {
                    odoo.call('your.model.name.handle_confirm_result', {{
                        record_id: {record_id},
                        result: true
                    }});
                }
            }
        ]
    }).open();
});

步骤2:结果处理逻辑

handle_confirm_result函数与方案1完全一致,负责处理用户的选择结果。

关键说明

  • 该方式为异步执行:Python函数先返回触发弹窗的动作,浏览器执行弹窗后,用户操作结果通过RPC回调后端处理函数,不存在代码阻塞问题。
  • 无需依赖Wizard或XML配置:完全通过Python+前端JS协作实现,可在任意Python业务函数中触发。

内容的提问来源于stack exchange,提问作者Talented Developer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:55:24