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

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)**来处理分支跳转:

步骤:

    1. 进入Odoo后台,打开「设置 > 技术 > 动作 > 服务器动作」,新建一个服务器动作
    1. 设置动作类型为「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]
    1. 回到你的模型视图,把按钮的动作类型设置为「服务器动作」,选择你刚才创建的这个动作,不需要再写模型里的Python方法了!

这个方案的好处:

  • 不用修改模型代码,降低耦合度
  • 后续调整跳转逻辑时,直接在后台修改服务器动作即可,不用重新部署代码
  • 非开发人员也能在后台调整逻辑(如果有权限的话)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:09:01