我的Odoo v8模块上有这个代码:
@api.multi
def button_generate_wh_doc(self):
context = self._context
partner = self.env['res.partner']
res = {}
for inv in self:
view_id = self.env['ir.ui.view'].search([
('name', '=', 'account.invoice.wh.iva.customer')])
context.update({
'invoice_id': inv.id,
'type': inv.type,
'default_partner_id': partner._find_accounting_partner(
inv.partner_id).id,
'default_name': inv.name or inv.number,
'view_id': view_id,
})
res = {
'name': _('Withholding vat customer'),
'type': 'ir.actions.act_window',
'res_model': 'account.wh.iva',
'view_type': 'form',
'view_id': False,
'view_mode': 'form',
'nodestroy': True,
'target': 'current',
'domain': "[('type', '=', '" + inv.type + "')]",
'context': context
}
return res
这是一个按钮动作,但当我点击它时它会抛出我:
File "/home/user/odoov8/odoo-venezuela/l10n_ve_withholding_iva/model/invoice.py", line 427, in button_generate_wh_doc
'view_id': view_id,
File "/home/user/odoov8/odoo-8.0-20161017/openerp/tools/misc.py", line 1280, in update
raise NotImplementedError("'update' not supported on frozendict")
NotImplementedError: 'update' not supported on frozendict
有人遇到过这种错误吗?
我认为这与调用上下文的顺序有关,但我不确定。
答案 0 :(得分:6)
要更新上下文,请尝试此操作。
context = self.env.context.copy()
context.update({'domain':[('something','=','something')]})
现在使用它作为您的上下文变量。
更新:
上述解决方案适用于此问题中描述的用例。然而,在Odoo中有许多情况,其中从环境中获取上下文,并且上述答案并未真正解释如何以这种方式更新上下文。因此,在这种情况下,您将需要使用其他人在此帖子中描述的with_context()函数。
context = self.env.context.copy()
context.update({'domain':[('something','=','something')]})
self.with_context(context).your_function()
在这种情况下,自我是有问题的对象,可能会有所不同。您可以在Odoo源代码中找到许多with_context()的示例。
答案 1 :(得分:6)
确保你可以复制上下文并按照自己喜欢的方式使用,但是当你复制forezedict时,它会产生新的dict打破当前上下文,而我建议你使用with_context
方法。
self.with_context(key=value,key=value)
这将更新当前环境上下文并自动推进。
答案 2 :(得分:0)
我遇到了同样的问题,并且找到了此解决方案here