odoo one2many 默认未设置
Posted
技术标签:
【中文标题】odoo one2many 默认未设置【英文标题】:odoo one2many default not set 【发布时间】:2015-07-24 10:16:55 【问题描述】:我编写了一个向导,表单视图应该显示 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')
【问题讨论】:
您确定要在 default_get 中使用 self.id 吗?我敢打赌,该对象还没有 id。我认为 id 是在创建对象之后出现的。为了创建对象,您需要默认值。我错过了什么? 【参考方案1】:问题可能就在那里:
res['details'] = **[(6, False, dws)]**
您的详细信息字段是 One2many 字段,[(6,0, [IDS])] 用于 Many2many。 在您的情况下,您不需要为详细信息字段分配任何内容;它是 One2many,所以它是自动的,因为您已经创建了相应的 Many2one 记录 (dw)。
Little reminder from the doc:
对于多对多还有 One2many:对于 many2many 字段,需要一个元组列表。这是清单 被接受的元组,具有相应的语义
(0, 0, values ) 链接到需要创建的新记录 使用给定的值字典
(1, ID, values ) 用 id = ID 更新链接记录(写 值就可以了)
(2, ID) 移除并删除 id = 的链接记录 ID(在 ID 上调用 unlink,这将完全删除对象,并且 还有链接)
(3, ID) 切断与 id = ID 的链接记录的链接 (删除两个对象的关系但不删除 目标对象本身)
(4, ID) 链接到 id = ID 的现有记录(添加一个 关系)
(5) 取消所有链接(例如对所有链接使用 (3,ID) 记录)
(6, 0, [IDs]) 替换链接 ID 列表(如使用 (5) 然后 (4,ID) 对于 ID 列表中的每个 ID)
示例:[(6, 0, [8, 5, 6, 4])] 将 many2many 设置为 ids [8, 5, 6, 4]
(0, 0, values ) 链接到需要创建的新记录 使用给定的值字典
(1, ID, values ) 用 id = ID 更新链接记录(写 值就可以了)
(2, ID) 移除并删除 id = 的链接记录 ID(在 ID 上调用 unlink,这将完全删除对象,并且 还有链接)
示例:[(0, 0, 'field_name':field_value_record1, ...), (0, 0, 'field_name':field_value_record2, ...)]
此外,如果您希望其他人易于理解您的代码,请尝试关注 odoo guidelines 获取 Many2One/One2many 字段:
One2Many 和 Many2Many 字段应始终以 _ids 作为后缀(例如:sale_order_line_ids)
Many2One 字段应以 _id 作为后缀(例如:partner_id、user_id、...)
【讨论】:
我尝试使用 res['details'] = [(0, 0, dws)] 和 dws 一个 dict 数组,但后来我意识到我只需要 res['details'] = dws.关于指南,您是对的,但是对于新的 API 8 恕我直言,这应该不再需要,因为“ids”不仅仅是数字,而是整个对象。例如,符号 object_id.id 是多余的。它可能具有向后兼容性的意义...... 我同意它现在感觉有点过时了,但是,object_record / object_records 似乎有点冗长,不是吗? ;) 也许他们将来会指向像 object_rd / object_rds 这样的东西,谁知道呢。 看来你不需要'delivery':self.id 实际上self.id==False 在那一刻你已经意识到你只需要res['details'] = dws 那里是一种魔术,在插入父对象后,将“交付”字段分配给带有 self.id 的子实体。以上是关于odoo one2many 默认未设置的主要内容,如果未能解决你的问题,请参考以下文章
如何在 odoo 14 中取消缩小 one2many 树视图的列标题?