## OnChange
“onchange”的机制提供了一种方式,客户端界面更新表单时,用户在一个领域中的值填充,而不保存任何数据库。
例如,假设一个模型有三个字段 `amount`, `unit_price` 和 `price`, 你要更新的形式,当任何其他领域被修改的价格。要实现这一点,定义一个方法 `self` 表示窗体视图中的记录,并将其装饰 [`onchange()`](https://www.odoo.com/documentation/9.0/reference/orm.html#openerp.api.onchange "openerp.api.onchange") 要指定要触发的字段。任何改变,你作出的自我将反映的形式。
~~~ xml
<!-- content of form view -->
<field name="amount"/>
<field name="unit_price"/>
<field name="price" readonly="1"/>
~~~
~~~ python
# onchange 处理程序
@api.onchange('amount', 'unit_price')
def _onchange_price(self):
# 设置自动更改字段
self.price = self.amount * self.unit_price
# 可以选择返回一个警告和域
return {
'warning': {
'title': "Something bad happened",
'message': "It was very bad indeed",
}
}
~~~
计算机领域,重视` onchange `行为是内置可以通过玩弄*会议*形式出现:改变座位或参与者的数量,和` taken_seats ` ProgressBar 自动更新。
练习
Warning
添加一个明确的onchange警告无效的值,如座位的负数,参与者比座以上。
*openacademy/models.py*
~~~ python
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",
},
}
~~~