odoo one2many default not set

11,374

The problem may be there :

res['details'] = **[(6, False, dws)]**

Your details field is a One2many field, [(6,0, [IDS])] are for Many2many. In your case, you don't need to assign anything to the details fields ; it's a One2many, so it's automatic as you already created the corresponding Many2one record (dw).

Little reminder from the doc :

  • For Many2many

For a many2many field, a list of tuples is expected. Here is the list of tuple that are accepted, with the corresponding semantics

(0, 0, { values }) link to a new record that needs to be created with the given values dictionary

(1, ID, { values }) update the linked record with id = ID (write values on it)

(2, ID) remove and delete the linked record with id = ID (calls unlink on ID, that will delete the object completely, and the link to it as well)

(3, ID) cut the link to the linked record with id = ID (delete the relationship between the two objects but does not delete the target object itself)

(4, ID) link to existing record with id = ID (adds a relationship)

(5) unlink all (like using (3,ID) for all linked records)

(6, 0, [IDs]) replace the list of linked IDs (like using (5) then (4,ID) for each ID in the list of IDs)

Example: [(6, 0, [8, 5, 6, 4])] sets the many2many to ids [8, 5, 6, 4]

  • And One2many :

(0, 0, { values }) link to a new record that needs to be created with the given values dictionary

(1, ID, { values }) update the linked record with id = ID (write values on it)

(2, ID) remove and delete the linked record with id = ID (calls unlink on ID, that will delete the object completely, and the link to it as well)

Example: [(0, 0, {'field_name':field_value_record1, ...}), (0, 0, {'field_name':field_value_record2, ...})]

Also, try to follow odoo guidelines for Many2One/One2many fields if you want your code to be easily understandable by other people :

One2Many and Many2Many fields should always have _ids as suffix (example: sale_order_line_ids)

Many2One fields should have _id as suffix (example : partner_id, user_id, ...)

Share:
11,374
Alessandro Ruffolo
Author by

Alessandro Ruffolo

BY DAY: Computer Engineer actually working on a OpenErp 8 Project. I also worked in Java, C#, Delphi. Basic Knowledge of CSS/HTML/XML/JSON BY NIGHT: Preparing my wedding FOR FUN: Comics&RPG

Updated on June 04, 2022

Comments

  • Alessandro Ruffolo
    Alessandro Ruffolo almost 2 years

    I wrote a wizard which form view should show a one2many field with rows taken from context['active_ids'].

    I set the one2many default correctly, but when the form opens, no rows are showed.

    Did I miss anything? (I apologize for code bad indentation)

    class delivery_wizard(models.TransientModel):
    _name = 'as.delivery.wizard'
    
    address = fields.Many2one('res.partner')
    details = fields.One2many('as.delivery.detail.wizard', 'delivery')
    carrier = fields.Many2one('delivery.carrier')
    
    @api.model
    def default_get(self, fields_list):
        res = models.TransientModel.default_get(self, fields_list)
        ids = self.env.context.get('active_ids', [])
        details = self.env['as.delivery.detail'].browse(ids)
        dwz = self.env['as.delivery.detail.wizard']
        dws = []
        for detail in details:
            dw = dwz.create({
                'production': detail.production_id.id,
                'quantity': detail.quantity,
                'actual_quantity': detail.quantity,
                'enabled': detail.production_id.state == 'done',
                'delivery': self.id,
            })
            dws.append(dw.id)
    
        res['details'] = [(6, False, dws)]
        res['address'] = details[0].delivery_id.address_id.id
        return res
    
    class delivery_detail_wizard(models.TransientModel):
        _name = 'as.delivery.detail.wizard'
    
        production = fields.Many2one('as.production')
        quantity = fields.Float()
        actual_quantity = fields.Float()
        force = fields.Boolean()
        enabled = fields.Boolean()
        delivery = fields.Many2one('as.delivery.wizard')