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_synccontext=[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>