Python TypeError:int()参数必须是字符串或数字,而不是';列表';-奥多v8至奥多v10社区

Python TypeError:int()参数必须是字符串或数字,而不是';列表';-奥多v8至奥多v10社区,python,openerp,odoo-8,odoo-10,Python,Openerp,Odoo 8,Odoo 10,我有这个方法: @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(modu

我有这个方法:

@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\u open\u window([inv\u id],'action\u invoice\u tree1','account')
完整的方法如下所示:

@api.multi
def create_invoice(self): 
    """ Create a invoice refund
    """
    #context = context or {}
    wizard_brw = self.browse() 
    inv_id = self._context.get('active_id')
    for wizard in wizard_brw:
        if not wizard.sure:
            raise UserError(
                _("Validation error!"),
                _("Please confirm that you know what you're doing by"
                  " checking the option bellow!"))
        if (wizard.invoice_id and wizard.invoice_id.company_id.jour_id and
                wizard.invoice_id and wizard.invoice_id.company_id.acc_id):
            inv_id = self.action_invoice_create(wizard,
                                                wizard.invoice_id) 
        else:
            raise UserError(
                _('Validation error!'),
                _("You must go to the company form and configure a journal"
                  " and an account for damaged invoices"))
    return self.new_open_window([inv_id], 'action_invoice_tree1', 'account')
@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
@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\u open\u window
如下所示之前,它不会加载任何内容:

@api.multi
def create_invoice(self): 
    """ Create a invoice refund
    """
    #context = context or {}
    wizard_brw = self.browse() 
    inv_id = self._context.get('active_id')
    for wizard in wizard_brw:
        if not wizard.sure:
            raise UserError(
                _("Validation error!"),
                _("Please confirm that you know what you're doing by"
                  " checking the option bellow!"))
        if (wizard.invoice_id and wizard.invoice_id.company_id.jour_id and
                wizard.invoice_id and wizard.invoice_id.company_id.acc_id):
            inv_id = self.action_invoice_create(wizard,
                                                wizard.invoice_id) 
        else:
            raise UserError(
                _('Validation error!'),
                _("You must go to the company form and configure a journal"
                  " and an account for damaged invoices"))
    return self.new_open_window([inv_id], 'action_invoice_tree1', 'account')
@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
@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
但是
list\u id
给了我这样的信息:

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_id
,但现在它没有抛出任何错误,但它不起作用,它只是停留在同一窗口上,不重写任何发票

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

@api.multi
def create_invoice(self): 
    """ Create a invoice refund
    """
    #context = context or {}
    wizard_brw = self.browse() 
    inv_id = self._context.get('active_id')
    for wizard in wizard_brw:
        if not wizard.sure:
            raise UserError(
                _("Validation error!"),
                _("Please confirm that you know what you're doing by"
                  " checking the option bellow!"))
        if (wizard.invoice_id and wizard.invoice_id.company_id.jour_id and
                wizard.invoice_id and wizard.invoice_id.company_id.acc_id):
            inv_id = self.action_invoice_create(wizard,
                                                wizard.invoice_id) 
        else:
            raise UserError(
                _('Validation error!'),
                _("You must go to the company form and configure a journal"
                  " and an account for damaged invoices"))
    return self.new_open_window([inv_id], 'action_invoice_tree1', 'account')
@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
@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
有什么想法吗

编辑

这是原始的
新的\u打开\u窗口
方法:

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
问题在于:

 result['res_id'] = list_ids
我认为resu id应该是一个整数,而不是像您所给出的列表,如果您只想在表单视图中显示它,那么您只需要在resu id中传递一个id。但是如果您想传递更多的记录,那么就使用domain not resu id

result['domain'] = [('id', 'in' , list_ids)]
这样,只会显示域中的记录

当您需要编辑一条记录时使用res_id,如果您想要更多地使用域,则只需编辑一条记录

问题在于:

 result['res_id'] = list_ids
我认为resu id应该是一个整数,而不是像您所给出的列表,如果您只想在表单视图中显示它,那么您只需要在resu id中传递一个id。但是如果您想传递更多的记录,那么就使用domain not resu id

result['domain'] = [('id', 'in' , list_ids)]
这样,只会显示域中的记录

当您需要编辑一条记录时使用res_id,如果您想要更多地使用域,则只需编辑一条记录


我会像这样迁移该方法:

@api.multi
def新建打开窗口(列表id、xml id、模块)
“”“在视图窗体或树上生成新窗口”“”
action=self.env.ref(“{}.{}”.format(模块,xml\u id))
结果=操作。读取()[0]
如果isinstance(list_id,(list,tuple)):
结果['domain']=[('id','in',list_id)]
其他:
结果['res_id']=列表_id
返回结果

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

我将迁移该方法,如下所示:

@api.multi
def新建打开窗口(列表id、xml id、模块)
“”“在视图窗体或树上生成新窗口”“”
action=self.env.ref(“{}.{}”.format(模块,xml\u id))
结果=操作。读取()[0]
如果isinstance(list_id,(list,tuple)):
结果['domain']=[('id','in',list_id)]
其他:
结果['res_id']=列表_id
返回结果

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

为什么在调用
self.new\u open\u窗口([inv\u id],'action\u invoice\u tree1','account')时将
inv\u id
放入列表中?也许它应该是
self.new\u open\u window(inv\u id,'action\u invoice\u tree1,'account')
No,仍然是一样的,没有新的窗口,它什么都不做,这是我正在迁移的模块,但是代码有点模糊。你能在这里添加真正的origin方法吗?要打开弹出窗口,您需要返回字典,而不是窗口操作记录。这就是为什么在origin方法中有一个read。嗨@CZoellner,用原始方法编辑了我的问题,谢谢你为什么在调用
self.new\u open\u窗口([inv\u id],'action\u invoice\u tree1','account')时将
inv\u id
放入列表中?也许它应该是
self.new\u open\u window(inv\u id,'action\u invoice\u tree1,'account')
No,仍然是一样的,没有新的窗口,它什么都不做,这是我正在迁移的模块,但是代码有点模糊。你能在这里添加真正的origin方法吗?要打开弹出窗口,您需要返回字典,而不是窗口操作记录。这就是为什么origin方法中有一个read。Hi@CZoellner,用原始方法编辑了我的问题,谢谢,谢谢,这里也有同样的问题,当我转到发票时,它给了我一个无效的扩展页,:/Charif忘记了括号。域条目必须是元组(三元组)。我在中编辑了它。是的,无效页总是关于域中的语法错误。嗨,谢谢,这里也有同样的问题,当我转到发票时,它也给了我一个无效的扩展页。:/Charif忘记了括号。域条目必须是元组(三元组)。是的,无效的叶子总是关于领域中的语法错误非常感谢,它给出了一些其他问题,但我将为此打开另一个问题非常感谢,它给出了一些其他问题,但我将为此打开另一个问题