You need to enable JavaScript to run this app. Odoo14自定义Copy按钮触发copy_func缺失cr、uid、ids参数求助
优惠活动
大模型
产品
解决方案
定价
更多

Odoo14自定义Copy按钮触发copy_func缺失cr、uid、ids参数求助

问题根因

报错的核心原因是你在Odoo 14环境下,写了Odoo 8.0及更早版本才适用的旧API方法。Odoo 14的type="object"按钮的调用链路已经全面切换为RecordSet新API,触发方法时只会传入当前记录集self和运行上下文,不会自动给方法拆分传入cr、uid、ids三个独立参数,因此系统直接抛出“copy_func() missing 3 required positional arguments: 'cr', 'uid', and 'ids'”的类型错误。

具体修复方案

1. 重写copy_func方法,适配新API规范

把原来带旧参数的方法直接替换为新API写法,全程用RecordSet操作替代原来的pool、browse手动传参逻辑:

import logging
_logger = logging.getLogger(__name__)

def copy_func(self):
    _logger.info('=== copy_func start ===')
    # self 就是wizard当前的记录集,直接遍历取值即可
    for wizard_rec in self:
        # 通过env获取目标模型,替代旧版pool.get调用
        formmst_obj = self.env['com.formmst']
        # 定义复制时要覆盖的默认值
        copy_defaults = {
            'form_no': wizard_rec.form_no,
            # 关联字段直接取id即可,空值场景兼容处理
            'com_orgbas_id': wizard_rec.com_orgbas_id.id if wizard_rec.com_orgbas_id else False,
        }
        # 新API的copy方法仅需传入默认值字典,不需要传cr/uid参数
        formmst_obj.browse(wizard_rec.com_formmst_id.id).copy(copy_defaults)
    _logger.info('=== copy_func end ===')

2. 配套排查常见踩坑点

  • 确认com.formbas.copy.wizard是继承models.TransientModel的瞬态模型,否则按钮触发时系统无法正确加载wizard的记录数据。
  • 核对复制源逻辑:原代码中是要复制com_formmst_id字段指向的com.formmst记录,注意不要错把wizard自身的id当成待复制的源记录。
  • 不要在新API方法的签名里硬加cr、uid、ids这类旧参数,否则Odoo的参数校验逻辑会因为参数不匹配直接抛错。
  • 你编写的wizard视图XML配置没有问题,方法签名调整完成后,Copy按钮可直接正常触发调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 02:36:04