Какой шаблон для обработки 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