You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 20:05:45