odoo-onChange

"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",
               },
           }
posted @ 2018-06-21 17:28  LeeeetMe  阅读(466)  评论(0编辑  收藏  举报