## 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",
},
}
~~~