Метод is_valid
Метод is_valid применяется к экземпляру формы и запускает процесс валидации всех полей. Он возвращает True, если все данные формы прошли валидацию, и False в противном случае. При вызове метода происходит очистка данных и их преобразование в типы Python, а также выполняются все валидаторы, указанные для полей формы. Метод также заполняет словарь cleaned_data валидными данными и словарь errors ошибками для каждого поля.
Синтаксис
form.is_valid()
Пример
Давайте создадим форму для регистрации пользователя с валидацией имени и email:
from django import forms
from django.core.validators import EmailValidator
class RegistrationForm(forms.Form):
username = forms.CharField(max_length=50)
email = forms.EmailField(validators=[EmailValidator()])
age = forms.IntegerField(min_value=18, max_value=100)
# Создаем экземпляр формы с данными
form_data = {
'username': 'john_doe',
'email': 'john@example.com',
'age': 25
}
form = RegistrationForm(data=form_data)
if form.is_valid():
print("Form is valid")
print(form.cleaned_data)
else:
print("Form has errors")
print(form.errors)
Результат выполнения кода:
"Form is valid"
{'username': 'john_doe', 'email': 'john@example.com', 'age': 25}
Пример
Рассмотрим случай, когда данные формы не проходят валидацию:
from django import forms
class RegistrationForm(forms.Form):
username = forms.CharField(max_length=50)
email = forms.EmailField()
age = forms.IntegerField(min_value=18, max_value=100)
# Данные с ошибками
invalid_data = {
'username': 'j', # слишком короткое имя
'email': 'invalid-email', # неверный формат email
'age': 16 # возраст меньше минимального
}
form = RegistrationForm(data=invalid_data)
if form.is_valid():
print("Form is valid")
else:
print("Form has errors")
print("Errors:", form.errors)
Результат выполнения кода:
"Form has errors"
"Errors: {'username': ['Ensure this value has at least 50 characters (it has 1).'], 'email': ['Enter a valid email address.'], 'age': ['Ensure this value is greater than or equal to 18.']}"
Пример
Метод is_valid также работает с ModelForm, где валидация включает проверки на уровне модели:
from django import forms
from myapp.models import User
class UserForm(forms.ModelForm):
class Meta:
model = User
fields = ['username', 'email', 'age']
# Создаем форму с данными для существующего пользователя
user_data = {
'username': 'alex_smith',
'email': 'alex@example.com',
'age': 30
}
form = UserForm(data=user_data)
if form.is_valid():
user = form.save(commit=False)
print("User data is valid")
print("Username:", user.username)
print("Email:", user.email)
print("Age:", user.age)
else:
print("Validation failed")
print(form.errors)
Результат выполнения кода:
"User data is valid"
"Username: alex_smith"
"Email: alex@example.com"
"Age: 30"
Пример
Валидация формы с использованием метода clean для кросс-полевой проверки:
from django import forms
class PasswordForm(forms.Form):
password = forms.CharField(widget=forms.PasswordInput)
confirm_password = forms.CharField(widget=forms.PasswordInput)
def clean(self):
cleaned_data = super().clean()
password = cleaned_data.get('password')
confirm_password = cleaned_data.get('confirm_password')
if password and confirm_password and password != confirm_password:
raise forms.ValidationError("Passwords do not match")
return cleaned_data
# Данные с несовпадающими паролями
form_data = {
'password': 'secure123',
'confirm_password': 'different456'
}
form = PasswordForm(data=form_data)
if form.is_valid():
print("Passwords match")
else:
print("Validation failed")
print(form.non_field_errors())
Результат выполнения кода:
"Validation failed"
"['Passwords do not match']"
Смотрите также
-
атрибут
cleaned_data,
который содержит очищенные и валидированные данные формы -
атрибут
errors,
который содержит словарь ошибок валидации формы -
метод
save,
который сохраняет данные модели из ModelForm -
метод
add_error,
который программно добавляет ошибку в форму