我有一个模型,其中添加了一些自定义验证(我重写了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()) 这是我应用程序中最大的模型,只有一个如此复杂。我想知道它是否写正确。