Odoo V15:如何通过@api.onchange函数自动生成预订明细行
Odoo自动生成预订明细行解决方案
我用JavaScript做了个日历,点击“Libre”按钮会打开创建预订的视图。现在需要实现预订明细行自动生成(当前得手动添加),已知要用到@api.onchange函数。
roomid字段(对应视图里的“Room”)存储了要添加到reservation_line的房间ID,这个ID是通过JavaScript获取的。
我已经写了部分代码,能正确获取目标房间,但不知道怎么自动生成明细行,代码如下:
class HotelReservation(models.Model): _name = "hotel.reservation" room_id = fields.Many2one("hotel.room", string="Room", required=True) roomid= fields.Integer(related='room_id.id', string="Room") reservation_line = fields.One2many( "hotel.reservation.line", "line_id", string="Reservation Line", help="Hotel room reservation details.", readonly=True, states={"draft": [("readonly", False)]}, ) @api.onchange('roomid') def onchange_reservation_line(self): if self.roomid: room = self.env['hotel.room'].search([('id' ,'=', self.roomid)]) # Some return here?
解决方案
要自动生成reservation_line明细行,你可以在onchange方法里用Odoo的One2many字段专用命令来添加新行。另外直接监听room_id比监听关联的roomid更高效,不用额外执行数据库搜索。
修改后的代码示例:
class HotelReservation(models.Model): _name = "hotel.reservation" room_id = fields.Many2one("hotel.room", string="Room", required=True) roomid = fields.Integer(related='room_id.id', string="Room") reservation_line = fields.One2many( "hotel.reservation.line", "line_id", string="Reservation Line", help="Hotel room reservation details.", readonly=True, states={"draft": [("readonly", False)]}, ) @api.onchange('room_id') def onchange_reservation_line(self): if self.room_id: # 清空现有明细行(不需要保留旧行可删除此行) self.reservation_line = [(5, 0, 0)] # 添加新的预订明细行,根据你的hotel.reservation.line模型补充字段 self.reservation_line = [(0, 0, { 'room_id': self.room_id.id, # 按需添加其他必填字段,比如入住/退房日期、价格等 # 'check_in': self.check_in_date, # 'check_out': self.check_out_date, })]
代码说明
(5, 0, 0):Odoo字段命令,作用是清空当前所有明细行,不需要清空的话可以去掉这一行。(0, 0, {...}):创建新的明细行记录,第三个参数是要设置的字段键值对,必须根据你实际的hotel.reservation.line模型字段补充必填项,否则会报错。- 监听
room_id而非roomid:roomid是关联字段,room_id变化时roomid会同步更新,直接监听主字段避免了多余的数据库查询,效率更高。
内容的提问来源于stack exchange,提问作者odoo newbie
相关产品推荐
相关产品推荐

