Добавляем ошибки в форму минуя метод clean

Ali Aliev [2015-06-19]

Иногда бывает удобно добавлять ошибки полей формы минуя метод clean. Для этого в Django > 1.7 был добавлен новый метод add_error в экземпляр формы. Использовать этот метод легко, достаточно указать в качестве его параметра id поля и сообщение об ошибке, после чего вернуть form_invalid. Пример использования в FormView:

class TestFormView(FormView):
    form_class = TestForm
    template_name = 'test/form.html'

    def form_valid(self, form):
        less_than_one = form.cleaned_data.get('less_than_one')
        if less_than_one > 1:
            form.add_error('less_than_one', forms.ValidationError('Can not be greater than one'))
            return super(TestFormView, self).form_invalid(form)
        return super(TestFormView, self).form_valid(form)

Если по каким то причинам вы не в состоянии обновиться до Django > 1.7, есть вариант воспользоваться следующим приемом:

from django import forms
from django.forms.forms import NON_FIELD_ERRORS

class AddErrorMixin(object):
    "Backport add_error() for django <1.7"
    def add_error(self, field, msg):
        field = field or NON_FIELD_ERRORS
        if field in self._errors:
            self._errors[field].append(msg)
        else:
            self._errors[field] = self.error_class([msg])

class ExampleForm(AddErrorMixin, forms.Form):
    pass
Fork me on GitHub