Onchange Methods
An onchange method is triggered when the value for a field id is changed in the user
interface, usually in a form view. Let’s see this with the help of an example. For that,
consider a model which stores all student records.
class Student(models.Model):
_name = "student.student"
_description = "Student"
partner_id = fields.Many2one('res.partner', string="Partner")
phone = fields.Char(string="Phone Number")
email = fields.Char(string="Email", required=True)
Now, let us define an onchange method for the field partner_id which will update the
email and phone field values. We can write the email and phone number for the student
according to the partner selected in the partner_id field.
@api.onchange('partner_id')
def _onchange_partner_id(self):
self.write({
'email': self.partner_id.email,
'phone': self.partner_id.phone
})
An onchange method uses api decorator onchange() along with the field passed as
parameter. Hence the method defined will be performed when that field value changes from
the user interface. It is possible to pass more than one field as an argument for the
onchange() decorator.
Init Hooks
Init hook from the manifest file can be used to perform any operation you want. This
section shows how the init hook can be used to create some records. For that, we are
using post_init_hook.
The model in which we are creating records is student.student
from odoo import fields, models
class Student(models.Model):
_name = "student.student"
_description = "Student"
name = fields.Char(string="Name", required=True)
phone = fields.Char(string="Phone Number")
email = fields.Char(string="Email", required=True)
First step is to register the hook in the __manifest__.py file using the
key. post_init_hook.after installing the module, Odoo will search for
the corresponding method in the init file and will execute it.
'post_init_hook': 'create_student',
Add the create_student() method in init file.In this method, we are
creating a sample student record using the create method. In real time scenario we can
implement complex business logic here.
from odoo import api, SUPERUSER_ID
def create_student(cr, registry):
env = api.Environment(cr, SUPERUSER_ID, {})
env['student.student'].create({
'name': 'Student 1',
'phone': '+7865 6675 2341',
'email': 'student1@student.com'
})
Odoo also supports 2 other hooks called pre_init_hook hook and
uninstall_hook. pre_init_hook will be invoked before the module
installation, where as uninstall_hook is invoked at the time of module
installation.