One2many字段on_change函数不能改变自己的值?

时间:2015-09-01 07:46:36

标签: openerp odoo odoo-8 openerp-8

我有这两个领域。

'name'              : fields.char('Name'),
'addresses'         : fields.one2many('res.partner.address', 'partner','Addresses'),

此功能:

def addresses_change(self, cr, uid, ids, name, addresses, context=None):
        value = {}

        new_addresses = []
        address_pool = self.pool.get('res.partner.address')
        for address in address_pool.browse(cr, uid, addresses[0][2], context=context):
            new_addresses.append((1,address.id,{'street':'wall street','zip':'7777','partner': ids[0],'active':True}))

        value.update(name='whatever')
        value.update(addresses=new_addresses)
        return {'value':value}

这些视图字段:

<field name="name" on_change="addresses_change(name,addresses)"/>
<field name="addresses" on_change="addresses_change(name,addresses)"/>

现在,当我更改name时,nameaddresses都会更新。但是,当我更改addresses时,其自身的值未更新,但name已更新。所以这种奇怪的行为只会影响one2many个字段。这是为什么?

如何将on_change个字段添加到可以更新自己值的one2many字段中?

编辑:我发现这可能是odoo的限制,他们修复了这个问题吗? Link to the issue

2 个答案:

答案 0 :(得分:3)

在最新版本的models.py上应用以下补丁(2015年8月4日15:22:33提交的版本+0200):

ul/ol

换句话说,只需注释--- a/openerp/models.py +++ b/openerp/models.py @@ -5897,9 +5897,9 @@ class BaseModel(object): # At the moment, the client does not support updates on a *2many field # while this one is modified by the user. - if field_name and not isinstance(field_name, list) and \ - self._fields[field_name].type in ('one2many', 'many2many'): - result['value'].pop(field_name, None) + ## if field_name and not isinstance(field_name, list) and \ + ## self._fields[field_name].type in ('one2many', 'many2many'): + ## result['value'].pop(field_name, None) return result 文件的第5900行到第5902行。

当然,此解决方案存在很大的缺点 - 每次在您使用的Odoo发行版中更新openerp/models.py文件时,都需要应用补丁。

也存在相当大的风险 - 他们说Web客户端在onchange事件中更新的one2many和many2many字段处理不佳。我现在没有发现任何问题,但我将继续测试我的开发安装Odoo ......

答案 1 :(得分:0)

我创建了对odoo版本8的拉取请求

https://github.com/odoo/odoo/issues/2693

问题中提到的更改和此处

    if field_name and not isinstance(field_name, list) and \
-                self._fields[field_name].type in ('one2many', 'many2many'):
+        if field_name and not isinstance(field_name, list):