odoo one2many 默认未设置

odoo one2many default not set

我写了一个向导,它的表单视图应该显示一个 one2many 字段,其中的行来自 context['active_ids'].

我正确设置了 one2many 默认值,但是当表单打开时,没有显示任何行。

我错过了什么吗? (对于代码错误的缩进,我深表歉意)

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')

问题可能出在:

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

您的详细信息字段是 One2many 字段,[(6,0, [IDS])] 用于 Many2many。 在您的情况下,您不需要为详细信息字段分配任何内容;这是一个 One2many,所以它是自动的,因为您已经创建了相应的 Many2one 记录 (dw)。

Little reminder from the doc :

  • 多对多

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]

  • 和一对多:

(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, ...})]

此外,如果您希望其他人易于理解您的代码,请尝试在 Many2One/One2many 字段中遵循 odoo guidelines :

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, ...)