В процессе поиска способа проверки моих форм 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