как изменить значение поля с помощью onchange в odoo

#python-2.7 #odoo-9

#python-2.7 #odoo-9

Вопрос:

В моем классе есть два поля выбора посещаемость и тип отпуска, когда присутствует посещаемость, тип отпуска должен быть доступен только для чтения, когда моя посещаемость отсутствует, поле выбора типа отпуска является обязательным, и я выбираю как отпуск по болезни, и я сохраняю запись, когда редактирую ту же запись, и я посещаюпомечается как присутствующее, значение поля типа leave должно быть ложным. Я задал поле только в false, но запись сохраняется в базе данных … может ли кто-нибудь помочь в этом

Это функция onchange

 @api.onchange('attendance', 'employee_id', 'attendance_date')
def onchange_attendance(self):
    if self.attendance:
        if self.attendance == 'present':

            time_in = time_out = False

            self.present = True
            self.absent = False
            self.half_day = False
            self.late = False
            self.comp_off = False
            self.leave_type = False
            self.holiday = False
            self.weekly_off = False
            self.compensation_date = False
        if self.attendance == 'absent':
            self.present = False
            self.absent = True
            self.half_day = False
            self.late = False
            self.comp_off = False
            self.holiday = False
            self.weekly_off = False
            self.compensation_date = False
        if self.attendance == 'half_day':
            self.present = False
            self.absent = False
            self.half_day = True
            self.late = False
            self.comp_off = False
            self.holiday = False
            self.weekly_off = False
            self.compensation_date = False
        if self.attendance == 'comp_off':
            self.present = False
            self.absent = False
            self.half_day = False
            self.late = False
            self.comp_off = True
            self.leave_type = False
            self.holiday = False
            self.weekly_off = False
        if self.attendance == 'holiday':
            self.present = False
            self.absent = False
            self.half_day = False
            self.late = False
            self.comp_off = False
            self.leave_type = False
            self.holiday = True
            self.weekly_off = False
            self.compensation_date = False
        if self.attendance == 'weekly_off':
            self.present = False
            self.absent = False
            self.half_day = False
            self.late = False
            self.comp_off = False
            self.leave_type = False
            self.holiday = False
            self.weekly_off = True
            self.compensation_date = False
  

Комментарии:

1. leave_type — это поле выбора или логическое значение, какой вариант для leave_type

2. leave_type = поля. Выбор([(‘случайный отпуск’, ‘Случайный отпуск’), (‘больничный отпуск’, ‘Отпуск по болезни’), (‘заработанный отпуск’, ‘Заработанный отпуск’), (‘Отпуск по беременности и родам’, ‘Отпуск по беременности и родам’), (‘Отпуск по уходу за ребенком’, ‘Отпуск по уходу за ребенком’), (‘loss_of_pay’, ‘Потеря оплаты’)], sting=’Оставить тип’, только для чтения= True, состояния={‘черновик’: [(‘только для чтения’, False)]})

Ответ №1:

Я суммирую ваши замечания.

  1. Посещаемость = Присутствует, затем оставьте тип = Только для чтения.
  2. Посещаемость = False, затем оставьте тип = Обязательно.
  3. Вы сохраняете запись с посещаемостью = False и типом отпуска = Отпуск по болезни.(Это значение, сохраненное в БД).
  4. Теперь вы пытаетесь отредактировать эту запись. Изменение посещаемости = True, теперь тип оставления = Только для чтения. Таким образом, это поле не может быть обновлено с помощью метода onchange.

Если вы хотите обновить это значение поля, вам нужно сделать это в методе write.

 @api.multi
def write(self, vals):
    res = super(*yourmodel*, self).write(vals)
    if vals.get('attendance') and vals.get('attendance') == 'present':
        self.leave_type = False
    return res
  

Я надеюсь, что это поможет.

Комментарии:

1. Я попробовал этот метод, и он мне помог, но единственная проблема, с которой я столкнулся, заключается в том, что значение leave становится false для всей записи, но я хочу, чтобы конкретная запись посещаемости была ложной… пожалуйста, помогите в этой ситуации… Спасибо

2. @api.multi def запись (self, vals): печать self, «SElf» печать vals, «vals» res = super(ManualAttendanceLine, self). напишите (vals), если vals.get(‘посещаемость’) и vals.get(‘посещаемость’) != (‘отсутствует’,’полдня’): self.leave_type = False # если vals.get(‘посещаемость’) и vals.get(‘посещаемость’) !=’half_day’: # self.leave_type = False, если vals.get(‘посещаемость’) и vals.get(‘посещаемость’) != ‘comp_off’: self.compensation_date = False возвращает значение