Odoo 10中如何从Python返回已有的ir.actions.act_window?
解决Odoo按钮跳转动作返回错误的问题
嘿,我帮你搞定这个跳转动作的问题!你遇到的核心问题是直接返回ORM对象的__dict__会包含Odoo内部的属性,前端无法识别,下面给你两个靠谱的解决方案:
1. 正确返回动作的标准字段字典
不用手动构造字典,直接用Odoo提供的read()方法就能拿到前端需要的纯动作属性字典。修改你的方法如下:
@api.multi def my_button_method(self): self.ensure_one() action = False if self.my_field == 'A': action = self.env.ref('my_module.my_ir_actions_act_window_A') elif self.my_field == 'B': action = self.env.ref('my_module.my_ir_actions_act_window_B') if action: # read()返回记录列表,取第一个元素就是纯字段字典 return action.read()[0]
为什么这样可行?
read()方法是Odoo ORM专门用来获取记录字段值的方法,它会自动过滤掉_prefetch、env这些内部属性,返回的字典正好是前端渲染动作需要的标准格式,完美适配跳转需求。
2. 更优的服务器动作方案
如果想把逻辑和模型代码解耦,或者方便后续调整,推荐使用**服务器动作(ir.actions.server)**来处理分支跳转:
步骤:
- 进入Odoo后台,打开「设置 > 技术 > 动作 > 服务器动作」,新建一个服务器动作
- 设置动作类型为「Python代码」,然后在代码框里写分支逻辑:
# 获取当前点击的记录 record = env['your.model.name'].browse(env.context.get('active_id')) action = False if record.my_field == 'A': action = env.ref('my_module.my_ir_actions_act_window_A') elif record.my_field == 'B': action = env.ref('my_module.my_ir_actions_act_window_B') if action: return action.read()[0]
- 回到你的模型视图,把按钮的动作类型设置为「服务器动作」,选择你刚才创建的这个动作,不需要再写模型里的Python方法了!
这个方案的好处:
- 不用修改模型代码,降低耦合度
- 后续调整跳转逻辑时,直接在后台修改服务器动作即可,不用重新部署代码
- 非开发人员也能在后台调整逻辑(如果有权限的话)
内容的提问来源于stack exchange,提问作者forvas
相关产品推荐
相关产品推荐

