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

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即可;另外代码里的&gt;=和&lt;=是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:26:43