“onchange”机制为客户端界面提供了一种方法,只要用户在字段中填写了值,便无需用户将任何内容保存到数据库即可更新表单。

例如,假设一个模型有三个字段amountunit_priceprice,并且您想在修改其他任何字段时更新表单上的价格。为此,请定义一个方法,该方法在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",
                },
            }