метод очистки формы перезаписи django
при перезаписи метода очистки формы как вы знаете, если его неудачная проверка на любом из полей? например, в форме ниже, если я перезаписываю метод clean, как узнать, не прошла ли форма проверку в любом из полей?
class PersonForm(forms.Form):
title = Forms.CharField(max_length=100)
first_name = Forms.CharField(max_length=100)
surname = Forms.CharField(max_length=100)
password = Forms.CharField(max_length=100)
def clean(self, value):
cleaned_data = self.cleaned_data
IF THE FORM HAS FAILED VALIDATION:
self.data['password'] = 'abc'
raise forms.ValidationError("You have failed validation!")
ELSE:
return cleaned_data
спасибо
4 ответов
вы можете проверить, были ли добавлены какие-либо ошибки в ошибку dict:
def clean(self, value):
cleaned_data = self.cleaned_data
if self._errors:
self.data['password'] = 'abc'
raise forms.ValidationError("You have failed validation!")
else:
return cleaned_data
бонус! Вы можете проверить наличие ошибок в определенных полях:
def clean(self, value):
cleaned_data = self.cleaned_data
if self._errors and 'title' in self._errors:
raise forms.ValidationError("You call that a title?!")
else:
return cleaned_data
Если ваши данные не проверяет, свой Экземпляр формы не будет атрибут cleaned_data
Django Doc при доступе к "чистым" данным
использовать self.is_valid()
.
вот простой пример переопределения clean()
на django.forms.Form
и django-braces
на AnonymousRequiredMixin
требовать, чтобы только анонимные пользователи посещали страницу Loing:
class LoginView(AnonymousRequiredMixin, FormView):
"""
Main Login. And Social Logins
"""
template_name = 'core/login.html'
form_class = LoginForm
success_url = reverse_lazy('blog:index')
def get_success_url(self):
try:
next = self.request.GET['next']
except KeyError:
next = self.success_url
return next
def form_valid(self, form):
cd = form.cleaned_data
user = auth.authenticate(username=cd['login_username'],
password=cd['login_password'])
if user:
auth.login(self.request, user)
messages.info(self.request, 'You are logged in.')
return super(LoginView, self).form_valid(form)
хотя его старый пост, если вы хотите применить проверки на более чем 1 поле той же формы / modelform use clean()
. Этот метод возвращает cleaned_data словарь.
чтобы показать ошибки пользователям, вы можете использовать add_error(<fieldname>, "your message")
метод. Это покажет ошибки вместе с именем поля, а не поверх формы. Пример приведен ниже:
add_error()
автоматически удаляет поля из cleaned_data словарь, вам не нужно удалять его вручную. Также вам не нужно ничего импортировать, чтобы использовать это.
def clean(self):
if self.cleaned_data['password1'] != self.cleaned_data['password2']:
msg = 'passwords do not match'
self.add_error('password2', msg)
return self.cleaned_data
если вы просто хотите проверить на одном поле формы / modelform использовать clean_<fieldname>()
. Этот метод будет принимать значения из cleaned_data словарь, а затем вы можете проверить наличие логических ошибок. Всегда возвращайте значение, как только вы закончите проверку логики.
def clean_password(self):
password = self.cleaned_data['password']
if len(password)<6:
msg = 'password is too short'
self.add_error('password', msg)
return password