OpenERP中onchange字段无效
我想在销售订单的树形视图中显示一个叫做 phone
的 res.partner
字段。
但是它什么都不显示,只是字段的名字,没有数据。这是我在 sale.order
中的代码:
phone : fields.char('Telefono del Cliente'),
这个字段的 onchange 函数:
def onchange_phone(self, cr, uid, ids, phone, context=None):
res = {}
if phone:
obj = self.pool.get('res.partner')
browse(cr, uid, phone)
res['phone'] = obj.phone
return {'value' : res}
在 res.partner
中,这个字段也叫 phone
,显然是客户的电话,我需要在 sale.order
的树形视图中显示它,这是我在 sale_view.xml
中的代码:
<field name="phone" on_change="onchange_phone(phone)"/>
有什么想法吗?
提前谢谢你。
2 个回答
1
正如Odedra所建议的,你应该这样做(这段代码来自sale.py文件):
def onchange_partner_id(self, cr, uid, ids, part, context=None):
if not part:
return {'value': {'partner_invoice_id': False, 'partner_shipping_id': False, 'payment_term': False, 'fiscal_position': False}}
part = self.pool.get('res.partner').browse(cr, uid, part, context=context)
addr = self.pool.get('res.partner').address_get(cr, uid, [part.id], ['delivery', 'invoice', 'contact'])
pricelist = part.property_product_pricelist and part.property_product_pricelist.id or False
payment_term = part.property_payment_term and part.property_payment_term.id or False
fiscal_position = part.property_account_position and part.property_account_position.id or False
dedicated_salesman = part.user_id and part.user_id.id or uid
phone = part.phone or False
val = {
'partner_invoice_id': addr['invoice'],
'partner_shipping_id': addr['delivery'],
'payment_term': payment_term,
'fiscal_position': fiscal_position,
'user_id': dedicated_salesman,
'phone': phone,
}
if pricelist:
val['pricelist_id'] = pricelist
return {'value': val}
请注意,你不应该在基础模块上这样做,而是应该创建你自己的模块,并将其继承到sale.order模型上。此外,onchange在树形视图中是无法工作的(就像你提到的那样),但你可以很容易地在树形视图中显示它——你需要先在表单上放置它,并使用提供的onchange功能,然后再修改树形视图以显示电话号码。
1
作为一个建议,如果你想获取合作伙伴的电话号码,最好不要在电话号码字段的变化时去触发操作。你可以通过两种方式来获取电话号码。
第一种也是最好的方法,在销售订单(sale.order)中,有一个叫做 onchange_partner_id()
的方法。你只需要重写这个方法,并把合作伙伴的电话号码更新到值(vals)里。
第二种方法比较复杂,你可以重写销售订单的 create()
方法和 write()
方法。
关于 create()
方法的小技巧:
- 在
create()
方法中,你可以从上下文中获取合作伙伴的ID,比如用vals.get('partner_id')
。
关于 write()
方法的小技巧:
- 在
write()
方法中,你已经有了创建记录的ID,所以你只需要找到这个记录,然后把合作伙伴的电话号码写进去。