У меня есть модель, в которой я добавил некоторую пользовательскую проверку (я переписал чистый метод).Кажется, все работает нормально, кроме странной ошибки.Когда я пытаюсь создать экземпляр модели и оставить поля пустыми, вместо стандартного сообщения об ошибке 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 ()) Это самая большая модель в моем приложении и только одна такая сложная.Интересно, написано ли это правильно.