odoo-onChange
"onchange"机制为客户端界面提供了一个更新表单的方法,任何时候用户在一个字段中填写值时就会触发,不需要保存任何数据到数据库中。
例如,假如一个模型有三个字段分别为amount,unit_price和price,当其他任意字段被修改时,您希望在表单中更新价格字段。要实现这个效果,定义一个方法,self代表表单视图中的记录,使用onchange()装饰,指定它在哪个字段上触发。任何您对self所做的更改将会反映在表单上。
<!-- content of form view -->
<field name="amount"/>
<field name="unit_price"/>
<field name="price" readonly="1"/>
# onchange handler
@api.onchange('amount', 'unit_price')
def _onchange_price(self):
# set auto-changing field
self.price = self.amount * self.unit_price
# Can optionally return a warning and domains
return {
'warning': {
'title': "Something bad happened",
'message': "It was very bad indeed",
}
}
对于计算字段,赋值onchange行为被内建在课务表单中:更改座位或者参与者的数量,taken_seats的进度条就会被自动更新。
练习
警告
添加一个明确的onchange来对无效值进行警告,例如座位数为负数,或者参与者人数超过了座位数。
openacademy/models.py
r.taken_seats = 0.0
else:
r.taken_seats = 100.0 * len(r.attendee_ids) / r.seats
@api.onchange('seats', 'attendee_ids')
def _verify_valid_seats(self):
if self.seats < 0:
return {
'warning': {
'title': "Incorrect 'seats' value",
'message': "The number of available seats may not be negative",
},
}
if self.seats < len(self.attendee_ids):
return {
'warning': {
'title': "Too many attendees",
'message': "Increase seats or remove excess attendees",
},
}