“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",
},
}