Sunday, 23 November 2014

Odoo/OpenERP : Populate one2many list using on_change method

Following is the method to update/populate simple field value using on_change method:

return {'value' : {'field_name' : <field_value>}}

Most of the OpenERP developers will be aware of it.

What we will do if we have to add one2many list using on_change method? For example : I want to display list of leaves allotted, leaves taken and leaves pending of an employee. So on_change employee_id I want to show related updated leave list. leave_ids is one2many field in my main table.

what we have to do is as follow:

leave_ids = []       
for record in records:
    if record:
        leave_ids.append([0,0, {'holiday_status_id':record,'max_leaves':records[record]['max_leaves'],'leaves_taken':records[record]['leaves_taken'],'remaining_leaves':records[record]['remaining_leaves']}])

return {'value' : {'leave_ids' : leave_ids}}

Hopefully it will help someone.

If you need more detail on this. Please post your valuable comments.


Thanks!!!!!!!!!!!! Enjoy Programming :)

Reference Link :

http://stackoverflow.com/questions/20954412/create-and-edit-items-of-a-one2many-field-through-on-change-method

13 comments:

  1. Hi, Thanks for the great post Shiv. What is the meaning of two zeros in
    `leave_ids.append([0,0, {'holiday_status_id':record,'max_leaves...` ?

    ReplyDelete
    Replies
    1. Hi Aman, You can check full explanation about it here: https://doc.odoo.com/v6.0/developer/2_5_Objects_Fields_Methods/methods.html#osv.osv.osv.write

      Delete
  2. can i used that feature on odoo 8

    ReplyDelete
  3. can i use that feature on odoo 8.0

    ReplyDelete
  4. Thanks Shiv Modi. I tried your code, the one2many field populate only after save the form. i need to display records after on change but before save. is it possible.

    ReplyDelete
  5. hi..how to update only one cell in one2many field?

    ReplyDelete
  6. I tried working on something like this but showing at the backend but not display on the front end, This is my code, kindly check for me please

    @api.multi
    @api.onchange('contract_bool')
    def onchange_populate(self):
    if self.contract_bool==True:
    product_obj=self.env['product.template']
    product_filter_search=product_obj.search([('compulsory_product','=',True)])
    for abc in product_filter_search:
    create_contract_entries=self.clients_boq_id.create(
    {'stud_ids': [(0, 0, {'name':abc.id,'link_client_boq_oppor':product_obj.id})]})
    print create_contract_entries['name'].name
    print create_contract_entries['link_client_boq_oppor']


    ReplyDelete
    Replies
    1. print statements won't work in onchange...you have to assign values to self object or use return statement
      You can check default addons for reference

      Delete

Thanks for your valuable comments.

Nginx: Cannot allocate memory