odoov9覆盖旧api onchange

时间:2016-09-16 07:41:29

标签: openerp odoo-9

我想在res.partner模型中使用字段parent_id上的make 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旧样式调用onchange_parent_id methot。

也许有人可以建议我如何解决这个问题。

提前致谢

1 个答案:

答案 0 :(得分:0)

似乎_fields_sync使用onchange_parent_id调用context=[partner.id],这是转换错误的存在(api.py第756行)。

ODOO LOG
    警告......:伙伴:res.partner(93,)
    API:756:上下文= [93]

Python测试

>>> from openerp.tools import frozendict
>>> context = [93]
>>> frozendict(context)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
  
    

TypeError:无法将字典更新序列元素#0转换为序列

         
      

    
  

您可以移除旧的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>