Python3 函数缺少 3 个必需的位置参数

问题描述

我尝试在odoo 14中编写一个复制函数
但我收到以下错误

  odoo Server Error
  Traceback (most recent call last):
    File "/vagrant/odoo/odoo/addons/base/models/ir_http.py",line 237,in _dispatch
      result = request.dispatch()
    File "/vagrant/odoo/odoo/http.py",line 682,in dispatch
      result = self._call_function(**self.params)
    File "/vagrant/odoo/odoo/http.py",line 358,in _call_function
      return checked_call(self.db,*args,**kwargs)
    File "/vagrant/odoo/odoo/service/model.py",line 94,in wrapper
      return f(dbname,**kwargs)
    File "/vagrant/odoo/odoo/http.py",line 346,in checked_call
      result = self.endpoint(*a,**kw)
    File "/vagrant/odoo/odoo/http.py",line 911,in __call__
      return self.method(*args,line 530,in response_wrap
      response = f(*args,**kw)
    File "/vagrant/odoo/addons/web/controllers/main.py",line 1363,in call_button
      action = self._call_kw(model,method,args,kwargs)
    File "/vagrant/odoo/addons/web/controllers/main.py",line 1351,in _call_kw
      return call_kw(request.env[model],kwargs)
    File "/vagrant/odoo/odoo/api.py",line 396,in call_kw
      result = _call_kw_multi(method,model,line 383,in _call_kw_multi
      result = method(recs,**kwargs)
  Exception

  The above exception was the direct cause of the following exception:

  Traceback (most recent call last):
    File "/vagrant/odoo/odoo/http.py",line 638,in _handle_exception
      return super(JsonRequest,self)._handle_exception(exception)
    File "/vagrant/odoo/odoo/http.py",line 314,in _handle_exception
      raise exception.with_traceback(None) from new_cause
  TypeError: copy_func() missing 3 required positional arguments: 'cr','uid',and 'ids'

我已经搜索解决方案,但无法复制成功。

def copy_func(self,cr,uid,ids,context=None):
    _logger.info('=== copy_func start ===')

    for record in self.browse(cr,ids):
        formbas_obj = self.pool.get('com.formmst')
        defaults = {
            'form_no': record.form_no,'com_orgbas_id': record.com_orgbas_id.id if record.com_orgbas_id else False,}
        formbas_obj.copy(cr,record.com_formmst_id.id,defaults)
    _logger.info('=== copy_func end ===')

我在单击“复制”按钮时调用函数enter image description here

<record id="form_com_formbas_copy_wizard" model="ir.ui.view">
    <field name="name">form.com.formbas.copy.wizard</field>
    <field name="model">com.formbas.copy.wizard</field>
    <field name="arch" type="xml">
        <form>
            <group col="4">
                <field name="com_formmst_id"/>
                <newline/>
                <field name="form_no"/>
            </group>
            <footer>
                <button string="copy" name="copy_func" type="object" class="oe_highlight"/>
                or
                <button string="Cancel" special="cancel" type="object" class="oe_link"/>
            </footer>
        </form>
    </field>
</record>

我为此苦苦挣扎了一段时间。任何形式的帮助将不胜感激!

解决方法

使用新的 ORM API。为此,删除函数签名 - cr,uid,ids,context=None

旧 API

def afun(self,cr,context=None):

新 API

def afun(self):

def copy_func(self):
    _logger.info('=== copy_func start ===')

    for record in self:
        formbas_obj = self.env['com.formmst'].search(['id','=',121])
        defaults = {
            'form_no': record.form_no,'com_orgbas_id': record.com_orgbas_id.id if record.com_orgbas_id else False,}
        formbas_obj.write(defaults)
    _logger.info('=== copy_func end ===')

在您的函数中,为 formbas_obj 指定要写入默认值 的确切对象。

REference