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
相关产品推荐
相关产品推荐

