# From验证源码
def _clean_fields(self):
for name, field inself.fields.items():
# value_from_datadict() gets the data from the data dictionaries.
# Each widget type knows how to retrieve its own data, because some
# widgets split data over several HTML fields.
if field.disabled:
value = self.get_initial_for_field(field, name)
else:
value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
try:
if isinstance(field, FileField):
initial = self.get_initial_for_field(field, name)
value = field.clean(value, initial)
else:
value = field.clean(value)
self.cleaned_data[name] = value
if hasattr(self, 'clean_%s' % name):
value = getattr(self, 'clean_%s' % name)()
self.cleaned_data[name] = value
except ValidationError as e:
self.add_error(name, e)
from app01 import models
from django.core.exceptions import ValidationError
classTestForm(Form):
user = fields.CharField()
pwd = fields.CharField()
defclean_user(self):
val = self.cleaned_data['user']
if models.UserInfo.objects.filter(username=val).count():
raise ValidationError('用户名已经存在!')
else:
return self.cleaned_data['user']
defclean_pwd(self):return self.cleaned_data['pwd']
# From验证源码deffull_clean(self):"""
Cleans all of self.data and populates self._errors and
self.cleaned_data.
"""
self._errors = ErrorDict()
ifnot self.is_bound: # Stop further processing.return
self.cleaned_data = {}
# If the form is permitted to be empty, and none of the form data has# changed from the initial data, short circuit any validation.if self.empty_permitted andnot self.has_changed():
return
self._clean_fields()
self._clean_form()
self._post_clean()
def_clean_form(self):try:
cleaned_data = self.clean()
except ValidationError as e:
self.add_error(None, e)
else:
if cleaned_data isnotNone:
self.cleaned_data = cleaned_data
defclean(self):"""
Hook for doing any extra form-wide cleaning after Field.clean() has been
called on every field. Any ValidationError raised by this method will
not be associated with a particular field; it will have a special-case
association with the field named '__all__'.
"""return self.cleaned_data
from app01 import models
from django.core.exceptions import ValidationError
classTestForm(Form):
user = fields.CharField()
pwd = fields.CharField()
defclean_user(self):
val = self.cleaned_data['user']
if models.UserInfo.objects.filter(username=val).count():
raise ValidationError('用户名已经存在!')
else:
return self.cleaned_data['user']
defclean_pwd(self):return self.cleaned_data['pwd']
defclean(self):# 这个时候cleaned_data里所有的值都获取到了,可以进行 比如用户名 密码的联合唯一操作
user = self.cleaned_data.get('user')
email = self.cleaned_data.get('email')
if models.Student.objects.filter(user=user,email=email)
raise ValidationError('用户名和邮箱已经联合已经存在!')
else:
return self.cleaned_data