TypeError:int()参数必须是字符串或数字,而不是odoov8到odoov10社区的“list”

2024-03-29 09:41:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个方法:

@api.multi
def new_open_window(self, list_ids, xml_id, module):
    """ Generate new window at view form or tree
    """
    mod_obj = self.env['ir.model.data']
    act_obj = self.env['ir.actions.act_window']
    result = mod_obj._get_id(module, xml_id) 
    imd_id = mod_obj.browse(result)['res_id']
    result = act_obj.browse(imd_id)
    result['res_id'] 
    return result

现在,我单击一个按钮,它像这样调用这个函数return self.new_open_window([inv_id], 'action_invoice_tree1', 'account')完整的方法如下所示:

^{pr2}$

但在new_open_window方法如下所示之前,它不加载任何内容:

@api.multi
def new_open_window(self, list_ids, xml_id, module): #cr, uid, ids, list_ids, xml_id, module,  context=None
    """ Generate new window at view form or tree
    """
    mod_obj = self.env['ir.model.data']
    act_obj = self.env['ir.actions.act_window']
    result = mod_obj._get_id(module, xml_id) #cr, uid was first
    imd_id = mod_obj.browse(result)['res_id']#['res_id'] #cr, uid were first was read() before #(result, ['res_id'])
    result = act_obj.browse(imd_id) # cr, uid were first was read() before
    result['res_id'] = list_ids
    return result

但是list_ids扔给我的是:

Traceback (most recent call last):
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 638, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 675, in dispatch
result = self._call_function(**self.params)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 331, in _call_function
return checked_call(self.db, *args, **kwargs)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/service/model.py", line 119, in wrapper
return f(dbname, *args, **kwargs)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 324, in checked_call
result = self.endpoint(*a, **kw)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 933, in __call__
return self.method(*args, **kw)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 504, in response_wrap
response = f(*args, **kw)
File "/home/kristian/odoov10/odoo-10.0rc1c-20161005/odoo/addons/web/controllers/main.py", line 866, in call_button
action = self._call_kw(model, method, args, {})
File "/home/kristian/odoov10/odoo-10.0rc1c-20161005/odoo/addons/web/controllers/main.py", line 854, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/api.py", line 681, in call_kw
return call_kw_multi(method, model, args, kwargs)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/api.py", line 672, in call_kw_multi
result = method(recs, *args, **kwargs)
File "/home/kristian/odoov10/gilda/l10n_ve_fiscal_requirements/wizard/wizard_invoice_nro_ctrl.py", line 139, in create_invoice
return self.new_open_window([inv_id], 'action_invoice_tree1', 'account') 
File "/home/kristian/odoov10/gilda/l10n_ve_fiscal_requirements/wizard/wizard_invoice_nro_ctrl.py", line 114, in new_open_window
result['res_id'] = list_ids
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/models.py", line 5180, in __setitem__
return self._fields[key].__set__(self, value)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/fields.py", line 878, in __set__
value = self.convert_to_cache(value, record)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/fields.py", line 1109, in convert_to_cache
return int(value or 0)
TypeError: int() argument must be a string or a number, not 'list'

问题是这一行result['res_id'] = list_ids,但现在它没有抛出任何错误,但它不起作用,它只是停留在同一个窗口中,不重写任何发票。在

在这两个函数之前创建发票的方法如下所示:

@api.multi
def action_invoice_create(self, wizard_brw, inv_brw): #cr, uid, ids, wizard_brw, inv_brw, context=None
    """
    If the invoice has control number, this function is responsible for
    passing the bill to damaged paper
    @param wizard_brw: nothing for now
    @param inv_brw: damaged paper
    """
    invoice_line_obj = self.env['account.invoice.line']
    invoice_obj = self.env['account.invoice']
    acc_mv_obj = self.env['account.move']
    acc_mv_l_obj = self.env['account.move.line']
    tax_obj = self.env['account.invoice.tax']
    invoice = {}
    if inv_brw.nro_ctrl:
        invoice.update({
            'name': 'PAPELANULADO_NRO_CTRL_%s' % (
                inv_brw.nro_ctrl and inv_brw.nro_ctrl or ''),
            'state': 'paid',
            'tax_line': [],
        })
    else:
        raise UserError(
            _('Validation error!'),
            _("You can run this process just if the invoice have Control"
              " Number, please verify the invoice and try again."))
    inv_brw.write(invoice) 
    inv_brw.invoice_line_ids.write({
        'quantity' : 0.0,
        'invoice_line_tax_id' : [],
        'price_unit' : 0.0
    }) 

    taxes = self.env['account.tax'].search([]) 
    invoice_taxes = tax_obj.search(
        [('invoice_id', '=', inv_brw and inv_brw.id)]).unlink()
    move = inv_brw.move_id 

    if move: #if move_id:
        move.button_cancel() 
        move.ref = 'Damanged Paper' 
        move.line_ids.unlink() 
    return inv_brw.id

有什么想法吗?在

编辑

这是原始的new_open_window方法:

def new_open_window(self, cr, uid, ids, list_ids, xml_id, module,
                    context=None):
    """ Generate new window at view form or tree
    """
    mod_obj = self.pool.get('ir.model.data')
    act_obj = self.pool.get('ir.actions.act_window')
    result = mod_obj._get_id(cr, uid, module, xml_id)
    imd_id = mod_obj.read(cr, uid, result, ['res_id'])['res_id']
    result = act_obj.read(cr, uid, imd_id)
    result['res_id'] = list_ids
    return result

Tags: inpyodooselfidobjhomeline
2条回答

问题在于:

 result['res_id'] = list_ids

我认为res_id应该是一个整数,而不是一个列表,如果您只想在表单视图中显示它,那么您只需要在res_id中传递一个id,但是如果您想传递更多的记录,那么就使用domain而不是res_id

^{pr2}$

这样只会显示弄脏域的记录

res_id is used when you need to edit a record only one record if you want more use domain

我将迁移方法如下:

@api.multi
def new_open_window(list_ids, xml_id, module)
    """ Generate new window at view form or tree """
    action = self.env.ref("{}.{}".format(module, xml_id))
    result = action.read()[0]
    if isinstance(list_ids, (list, tuple)):
        result['domain'] = [('id', 'in', list_ids)]
    else:
        result['res_id'] = list_ids
    return result

ref将获得该操作的记录。read是一个多记录方法,将返回字典列表。最后我添加了@Charif的有趣提示。在

相关问题 更多 >