尝试在管理面板中使用空字段创建模型实例时,为什么会出现AttributeError?

时间:2019-06-13 22:09:06

标签: django validation django-models

我有一个模型,其中添加了一些自定义验证(我重写了clean方法)。一切似乎都正常,除了我收到一个奇怪的错误。当我尝试创建模型实例并将字段保留为空白时,没有得到诸如“您必须填写此字段”之类的标准错误消息,而是由于NoneType对象,我得到了AttributeError。

我已经花了很多时间试图找到答案。 我认为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()) 这是我应用程序中最大的模型,只有一个如此复杂。我想知道它是否写正确。

0 个答案:

没有答案