Метод full_clean
Метод full_clean применяется к экземпляру класса Form и запускает процесс полной проверки данных, переданных в форму. В ходе выполнения метода последовательно вызываются три этапа валидации: проверка каждого поля формы с использованием валидаторов и методов clean_<fieldname>, затем очистка всех данных через метод clean и, наконец, добавление ошибок, возникающих на каждом из этих этапов. Метод обычно вызывается неявно при обращении к атрибуту Form/method/is_valid/">is_valid или непосредственно для ручного запуска валидации, например, при работе с модельными формами и сохранением данных.
Метод full_clean не принимает никаких обязательных аргументов, но можно указать необязательный параметр exclude - список имен полей, которые следует исключить из проверки. Это полезно, когда нужно пропустить валидацию некоторых полей в определенных сценариях. Метод не возвращает значения, а все найденные ошибки валидации накапливаются в атрибуте Form/attribute/errors/">errors формы, который представляет собой объект ErrorDict.
Синтаксис
form.full_clean(exclude=None)
Пример
Рассмотрим базовую форму для регистрации пользователя. Вызовем метод full_clean вручную для проверки данных:
from django import forms
class RegisterForm(forms.Form):
username = forms.CharField(max_length=20)
email = forms.EmailField()
age = forms.IntegerField(min_value=18, max_value=99)
# Данные с ошибкой в возрасте
data = {
'username': 'john_doe',
'email': 'john@example.com',
'age': 15,
}
form = RegisterForm(data)
form.full_clean()
print(form.is_valid())
print(form.errors)
Результат выполнения кода:
"False"
"{\"age\": [\"Ensure this value is greater than or equal to 18.\"]}"
Пример
Покажем использование параметра exclude, который позволяет исключить определенные поля из проверки. Например, при частичном обновлении профиля можно пропустить валидацию поля email:
from django import forms
class ProfileForm(forms.Form):
username = forms.CharField(max_length=30)
email = forms.EmailField()
age = forms.IntegerField(min_value=18, max_value=99)
data = {
'username': 'jane_doe',
'email': 'not-an-email',
'age': 25,
}
form = ProfileForm(data)
# Исключаем поле email из проверки
form.full_clean(exclude=['email'])
print(form.is_valid())
print(form.errors)
Результат выполнения кода:
"True"
"{}"
Пример
Метод full_clean также используется при работе с модельными формами, где автоматически вызывается перед сохранением объекта. Однако его можно вызвать вручную, чтобы проверить данные без сохранения. Продемонстрируем на примере модели пользователя:
from django import forms
from django.db import models
class User(models.Model):
username = models.CharField(max_length=20)
email = models.EmailField()
age = models.IntegerField()
class UserForm(forms.ModelForm):
class Meta:
model = User
fields = ['username', 'email', 'age']
def clean_age(self):
age = self.cleaned_data.get('age')
if age and age < 18:
raise forms.ValidationError("Age must be at least 18")
return age
data = {
'username': 'peter',
'email': 'peter@example.com',
'age': 16,
}
form = UserForm(data)
form.full_clean()
print(form.is_valid())
print(form.errors)
Результат выполнения кода:
"False"
"{\"age\": [\"Age must be at least 18\"]}"