Почему я получаю AttributeError, когда пытаюсь создать экземпляр модели с пустыми полями в панели администратора? - PullRequest
0 голосов
/ 14 июня 2019

У меня есть модель, в которой я добавил некоторую пользовательскую проверку (я переписал чистый метод).Кажется, все работает нормально, кроме странной ошибки.Когда я пытаюсь создать экземпляр модели и оставить поля пустыми, вместо стандартного сообщения об ошибке sth вроде «Вы должны заполнить это поле», я получаю AttributeError из-за объекта NoneType.

Я уже потратил много временипытаясь найти ответ на это.Я думаю, что метод clean_fields () не вызывается до моего пользовательского метода clean (), но я понятия не имею, почему?Интересно, что если у меня есть какой-нибудь существующий экземпляр ClassOccurrence, откройте его для редактирования и оставьте обязательные поля пустыми, он будет работать правильно.Я получаю сообщение об ошибке в админке.Когда я попытался написать метод clean () для другой маленькой модели, у меня не было той же проблемы, что и для этой (ClassOccurrence).Кто-нибудь может помочь?У меня нет опыта в программировании, и у меня заканчиваются идеи ..

class ClassOccurrence(models.Model):
    course = models.ForeignKey(Course, on_delete=models.CASCADE, verbose_name='nazwa kursu')
    date = models.DateField(verbose_name='data')
    start_time = models.TimeField(blank=True, verbose_name='godzina rozpoczęcia')
    end_time = models.TimeField(blank=True, verbose_name='godzina zakończenia')
    main_teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE, null=True,
                                     blank=True, related_name='main_teacher_set', verbose_name='instruktor')
    substitute_teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE, null=True,
                                           blank=True, related_name='substitute_teacher_set', verbose_name='zastępstwo')
    students = models.ManyToManyField(User, blank=True, verbose_name='uczestnicy')

    # class Meta, __str__(), properties and some fields, that I are not relevant to the question asked

    def clean(self, *args, **kwargs):
        super(ClassOccurrence, self).clean(*args, **kwargs)
        # Date has to correspond to the weekday in course instance
        if self.date.isoweekday() != int(self.course.weekday[0]):
            raise ValidationError({'date': (f"Te zajęcia odbywają się w: {self.course.weekday[2:]}. Wybierz inną datę.")})
        # Checks if date and time is not in the past
        if datetime.combine(self.date, self.course.start_time) < datetime.now():
            raise ValidationError("Czas zajęć nie może być w przeszłości.")
        # Checks if no time collision with other classes on the same day
        class_same_day = ClassOccurrence.objects.filter(date=self.date).exclude(pk=self.pk)
        start = self.course.start_time
        end = self.course.end_time
        for c in class_same_day:
            if (c.start_time <= start < c.end_time or
                    c.start_time < end <= c.end_time or
                    start <= c.start_time and c.end_time <= end):
                raise ValidationError(f"Czas trwania zajęć koliduje z zajęciami {c.course.name}")
        # Substitute teacher has to be different than the teacher in course
        # instance
        if self.substitute_teacher == self.course.teacher:
            raise ValidationError({'substitute_teacher': (
                "Zastępstwo nie może się odbywać z instruktorem prowadzącym kurs.")})

    def save(self, *args, **kwargs):
          if not self.start_time or not self.end_time or not self.main_teacher:
            self.start_time = self.course.start_time
            self.end_time = self.course.end_time
            self.main_teacher = self.course.teacher
        super(ClassOccurrence, self).save(*args, **kwargs)

AttributeError, которую я описал выше, я получаю с первым проверенным условием в чистом методе (для self.date.isoweekday ()) Это самая большая модель в моем приложении и только одна такая сложная.Интересно, написано ли это правильно.

...