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