OpenERP中onchange字段无效

0 投票
2 回答
1303 浏览
提问于 2025-04-18 14:42

我想在销售订单的树形视图中显示一个叫做 phoneres.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,所以你只需要找到这个记录,然后把合作伙伴的电话号码写进去。

撰写回答