Какой шаблон для обработки clean(), когда clean_fields() не работает в Django Forms, Models и ModelForms?

В Django во время full_clean из Form, ModelForm или Models сначала вызывается clean_fields, а затем clean, даже если clean_fields не удалось. Это является проблемой, когда я ожидаю, что поля передадут clean_fields при вычислении clean. Рассмотрим следующий пример.

class SomeModel(Model):
  sum = models.SmallIntegerField()
  count = models.SmallIntegerField(validators=[MinValueValidator(1)])

  def clean(self):
    if self.sum / self.count > 1:
      raise ValidationError('The average must not exceed 1.')

В приведенном выше примере clean с sum=0, count=0 даст ZeroDivisionError. Следовательно, full_clean даст ZeroDivisionError вместо фактической ошибки, исходящей от clean_fields. Интересно, что clean будет вызван, даже если sum='X' или sum=None, т.е. даже не имеет правильного типа.

Это означает, что clean не может даже зависеть от того, что поля имеют правильный тип, не говоря уже о прохождении дополнительной валидации. Как я могу обработать проверку чистым способом без необходимости запускать clean_fields (или делать это самому) из каждого clean, который я пишу?

Вы должны вызвать метод clean родительского класса:

def clean(self):
    cleaned_data = super().clean()

    if self.cleaned_data.get("sum") / self.cleaned_data.get("count") > 1:
      raise ValidationError('The average must not exceed 1.')

    return cleaned_data
Вернуться на верх