В процессе поиска способа проверки моих форм django я столкнулся с двумя методами is_valid() и clean() в django docs. Может ли кто-нибудь просветить меня, как они разные/одинаковые? Каковы плюсы и минусы?
Спасибо.
В процессе поиска способа проверки моих форм django я столкнулся с двумя методами is_valid() и clean() в django docs. Может ли кто-нибудь просветить меня, как они разные/одинаковые? Каковы плюсы и минусы?
Спасибо.
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 вы можете повторно отобразить страницу с вашим перезаписанным объектом формы и отобразит сообщение об ошибке, если ваш шаблон использует строку с ошибкой.
Просто хотел добавить, что лучший способ добавить ошибку в форму, которую вы вручную проверяете в 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