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