Odoo中appliquer()函数参数错误:需至少4个参数却传入2个
解决Odoo中TypeError: appliquer() takes at least 4 arguments (2 given)的问题
这个错误我之前在Odoo开发中也碰到过,根源是你混用了Odoo新旧版本的API规范,导致参数传递不匹配。咱们一步步拆解解决:
错误原因分析
@api.multi是Odoo新API的装饰器,它会自动封装cr(游标)、uid(用户ID)、ids(记录ID列表)这些参数,不需要你在函数定义里显式声明。当按钮触发这个方法时,系统只会传入self(当前记录集)和可选的context,但你的函数定义要求至少4个参数,自然就抛出了参数不匹配的错误。
具体修改步骤
1. 修正函数签名
把原来带旧API参数的函数定义:
def appliquer(self,cr,ids,uid,context=None):
改成新API的标准签名:
def appliquer(self, context=None):
2. 调整向导记录的获取方式
新API下,self已经是经过封装的记录集,不需要再手动调用browse。原来的:
wizard = self.browse(cr, uid, ids[0], context)
可以简化为:
wizard = self[0] # @api.multi下self是记录集,取第一个元素就是当前向导记录
3. 修复搜索条件的错误
你的代码里有几个明显的逻辑错误,会导致后续功能异常:
res.append(x.agence_id):这里直接把对象加入搜索条件列表,应该改成搜索元组格式('agence_id', '=', x.agence_id.id)res.append(x.ca):这部分完全不符合搜索条件的格式,应该根据实际需求改成类似('state', '=', 'open')(假设x.open是控制是否筛选"open"状态的记录)- 日期部分的
x.date_from.id是错误的,日期字段不需要.id,直接用x.date_from即可;另外代码里的>=和<=是HTML转义字符,Python代码里直接用>=和<=就行
修改后的完整代码
@api.multi def appliquer(self, context=None): wizard = self[0] res = [] # 处理销售员筛选 if wizard.vendeur: res.append(('user_id', '=', wizard.vendeur.id)) # 处理机构筛选 if wizard.agence_id: res.append(('agence_id', '=', wizard.agence_id.id)) # 处理状态筛选(这里假设x.open/x.draft/x.paid是控制对应状态的布尔字段,你需要根据实际字段调整) state_filters = [] if wizard.open: state_filters.append('open') if wizard.draft: state_filters.append('draft') if wizard.paid: state_filters.append('paid') if state_filters: res.append(('state', 'in', state_filters)) # 处理日期范围筛选 if wizard.date_from and wizard.date_to: res.append(('date_from', '>=', wizard.date_from)) res.append(('date_to', '<=', wizard.date_to)) return { 'name': 'Chiffre d\'affaire', 'view_type': 'form', 'view_mode': 'tree,graph', 'res_model': 'ca.report', 'type': 'ir.actions.act.window', 'target': 'new', 'domain': res, # 注意:原来的'res'参数不对,应该用'domain'来传递搜索条件 }
另外还要注意:返回的action字典里,你原来写的'res' : res是错误的,传递搜索条件应该用'domain' : res,否则目标视图不会应用你的筛选条件。
最后检查
确保你的按钮XML定义是调用这个方法的标准方式,比如:
<button name="appliquer" string="Appliquer" type="object" class="oe_highlight"/>
不需要额外传递cr、uid等参数,新API会自动处理。
内容的提问来源于stack exchange,提问作者imad
相关产品推荐
相关产品推荐

