Подтвердить что ты не робот

Is_valid() vs clean() формы django

В процессе поиска способа проверки моих форм django я столкнулся с двумя методами is_valid() и clean() в django docs. Может ли кто-нибудь просветить меня, как они разные/одинаковые? Каковы плюсы и минусы?

Спасибо.

4b9b3361

Ответ 1

is_valid() вызывает clean() в форме автоматически. Вы используете is_valid() в своих представлениях и clean() в своих классах форм.

Ваша функция clean() вернет self.cleaned_data, которая, если вы заметите в следующем представлении, не будет обрабатываться вами как программистом.

form = myforms.SettingsForm(request.POST)
if form.is_valid():
   name = form.cleaned_data['name']
   #do stuff

Вам не нужно было делать clean_data = form.is_valid(), потому что is_valid() будет вызывать чистую и перезаписывать данные в очищаемом объекте формы. Таким образом, все в вашем блоке if form.is_valid() будет чистым и действительным. Поле name в вашем блоке будет дезинфицированной версией, которая не обязательно находится в request.POST.

Обновление Вы также можете отображать сообщения об ошибках. В clean(), если данные формы недействительны, вы можете установить сообщение об ошибке в поле, подобное этому:

self._errors['email'] = [u'Email is already in use']

Теперь is_valid() вернет False, поэтому в блоке else вы можете повторно отобразить страницу с вашим перезаписанным объектом формы и отобразит сообщение об ошибке, если ваш шаблон использует строку с ошибкой.

Ответ 2

Просто хотел добавить, что лучший способ добавить ошибку в форму, которую вы вручную проверяете в is_valid(), - это использовать Form.add_error(field, error) для соответствия объекту Django ErrorDict.

Выполнение

self._errors['field'] = ['error message']

выйдет фанки при рендеринге {{form.errors}}, например:

fielderror messsage

вместо ожидаемого

field
    -error message

поэтому вместо этого:

self.add_error('email', 'Email is already in use')

См. https://docs.djangoproject.com/en/1.10/ref/forms/api/#django.forms.Form.add_error