One2many字段on_change函数不能改变自己的值?
One2many field on_change function can't change its own value?
我有这两个字段。
'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
时,name
和 addresses
都会更新。但是当我更改 addresses
时,它自己的值不会更新,但 name
会更新。所以这种奇怪的行为只影响 one2many
个字段。这是为什么?
以及如何将 on_change
事件添加到可以更新其自身值的 one2many
字段?
编辑:我发现这可能是 odoo 的一个限制,他们解决了这个问题了吗? Link to the issue
在 models.py 的最新版本(2015 年 8 月 4 日星期二 15:22:33 +0200 提交的版本)上应用以下补丁:
--- 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
也就是说,把openerp/models.py
文件的5900到5902行注释掉即可。
当然,此解决方案有一个很大的缺点 - 每次在您使用的 Odoo 发行版中更新 models.py
文件时,您都需要应用补丁。
也存在相当大的风险 - 他们说 Web 客户端不能很好地处理 onchange 事件中更新的 one2many 和 many2many 字段。我现在没有发现任何问题,但我会继续测试我的 Odoo 开发安装...
我为 odoo 版本 8 创建了一个 Pull Request
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):
我有这两个字段。
'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
时,name
和 addresses
都会更新。但是当我更改 addresses
时,它自己的值不会更新,但 name
会更新。所以这种奇怪的行为只影响 one2many
个字段。这是为什么?
以及如何将 on_change
事件添加到可以更新其自身值的 one2many
字段?
编辑:我发现这可能是 odoo 的一个限制,他们解决了这个问题了吗? Link to the issue
在 models.py 的最新版本(2015 年 8 月 4 日星期二 15:22:33 +0200 提交的版本)上应用以下补丁:
--- 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
也就是说,把openerp/models.py
文件的5900到5902行注释掉即可。
当然,此解决方案有一个很大的缺点 - 每次在您使用的 Odoo 发行版中更新 models.py
文件时,您都需要应用补丁。
也存在相当大的风险 - 他们说 Web 客户端不能很好地处理 onchange 事件中更新的 one2many 和 many2many 字段。我现在没有发现任何问题,但我会继续测试我的 Odoo 开发安装...
我为 odoo 版本 8 创建了一个 Pull Request
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):