odoov9 覆盖旧 api onchange
odoov9 override old api onchange
我想在 res.partner 模型中在字段 parent_id 上创建 onchange 事件。这个字段已经有旧 api 的 onchange 事件,所以我将它在 XML 上的值更改为 on_change=1 并添加了 .py 代码
def onchange_parent_id(self):
self.category_id = self.parent_id.category_id
super(res_partner, self).onchange_parent_id(self)
更新后,然后我打开联系表并更改 parent_id,一切正常,但当我按保存时发生错误
TypeError: cannot convert dictionary update sequence element #0 to a sequence
据我所知,它发生是因为在创建其他方法时 (_fields_sync) 也通过 'old style' 调用此 onchange_parent_id 方法。
也许有人可以建议我如何解决这个问题。
提前致谢
似乎 _fields_sync
用 context=[partner.id]
调用了 onchange_parent_id
,这就是转换错误的原因(api.py 第 756 行)。
ODOO 日志:
警告...:合作伙伴:res.partner(93,)
api:756:context=[93]
Python 测试:
>>> from openerp.tools import frozendict
>>> context = [93]
>>> frozendict(context)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot convert dictionary update sequence element #0 to a sequence
您可以删除旧的 onchange event
并创建一个新的 (onchange_parent_id_new
) 而无需覆盖 onchange_parent_id
方法。
Python:
@api.model
@api.onchange('parent_id')
def onchange_parent_id_new(self):
old_res = super(res_partner, self).onchange_parent_id(self.parent_id.id)
if type(old_res) is dict and 'value' in old_res:
for field, value in old_res.get('value').items():
if hasattr(self, field):
setattr(self, field, value)
if self.parent_id:
self.category_id = self.parent_id.category_id
XML:
<record id="view_partner_form_inherit" model="ir.ui.view">
<field name="name">view.partner.form.inherit</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<field name="parent_id" position="replace">
<field name="parent_id"/>
</field>
</field>
</record>
我想在 res.partner 模型中在字段 parent_id 上创建 onchange 事件。这个字段已经有旧 api 的 onchange 事件,所以我将它在 XML 上的值更改为 on_change=1 并添加了 .py 代码
def onchange_parent_id(self):
self.category_id = self.parent_id.category_id
super(res_partner, self).onchange_parent_id(self)
更新后,然后我打开联系表并更改 parent_id,一切正常,但当我按保存时发生错误
TypeError: cannot convert dictionary update sequence element #0 to a sequence
据我所知,它发生是因为在创建其他方法时 (_fields_sync) 也通过 'old style' 调用此 onchange_parent_id 方法。
也许有人可以建议我如何解决这个问题。
提前致谢
似乎 _fields_sync
用 context=[partner.id]
调用了 onchange_parent_id
,这就是转换错误的原因(api.py 第 756 行)。
ODOO 日志:
警告...:合作伙伴:res.partner(93,)
api:756:context=[93]
Python 测试:
>>> from openerp.tools import frozendict
>>> context = [93]
>>> frozendict(context)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot convert dictionary update sequence element #0 to a sequence
您可以删除旧的 onchange event
并创建一个新的 (onchange_parent_id_new
) 而无需覆盖 onchange_parent_id
方法。
Python:
@api.model
@api.onchange('parent_id')
def onchange_parent_id_new(self):
old_res = super(res_partner, self).onchange_parent_id(self.parent_id.id)
if type(old_res) is dict and 'value' in old_res:
for field, value in old_res.get('value').items():
if hasattr(self, field):
setattr(self, field, value)
if self.parent_id:
self.category_id = self.parent_id.category_id
XML:
<record id="view_partner_form_inherit" model="ir.ui.view">
<field name="name">view.partner.form.inherit</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<field name="parent_id" position="replace">
<field name="parent_id"/>
</field>
</field>
</record>