onchange digunakan untuk melakukan event pada saat adanya perubahan pada field. Sebagai contoh, apabila kita memilih suatu produk, maka field satuan akan otomatis terisi satuan yang sebelumnya sudah didefinisikan pada produk.

onchange dapat digunakan untuk :

  1. Memberikan value kepada field lain
    return {‘value’ : values}
  2. Memberikan batasan (domain) untuk field many2one
    return {‘domain’ : res}

Note:

  • Pada one2many, setiap melakukan penambahan data pada detailnya, form akan langsung menjalankan fungsi (semua fungsi yang ada pada view yang aktif). Karena itu, selalu buat untuk menangani kondisi field kosong/null.
  • Dapat menggunakan value dan domain secara bersamaan
    return {‘value’ : values, ‘domain’ : res}

——————————————————————————————————————–

* Contoh Value :
Scenario memilih produk akan mengisi field satuan (many2one)

def product_id_change(self, cr, uid, ids, product_id):

if product_id:

values={}

product_ids = self.pool.get(‘product.product’).browse(cr, uid, [product_id])[0]

values.update({‘uom_id’ : product_ids.product_tmpl_id.uom_id.id})

return {‘value’ : values}

——————————————————————————————————————–

* Contoh Domain:
Scenario : Data konsumen dipilih akan memberikan field alamat (many2one) batasan berupa hanya menampilkan alamat yang sesuai dengan konsumen yang dipilih.

# DOMAIN : “ALAMAT INVOICE”

def onchange_konsumen(self, cr, uid, ids, partner_id):

res={}

alamat_domain = []

cr.execute(‘SELECT id FROM res_partner_address WHERE partner_id=’ + str(partner_id))

for alamat_partner_id in cr.fetchall():

alamat_domain.append(alamat_partner_id)

res.update({‘address_invoice_id’ : [(‘partner_id‘ ,’in’, alamat_domain)]})

return { ‘domain’ : res}