Django的clean()
函数是一个表单验证中十分重要的函数。当用户提交表单时,Django会自动调用clean()
函数,对表单中的数据进行验证和转换,从而确保数据的安全性和准确性。这个函数通常用于自定义数据验证的场合,例如验证用户输入的密码是否符合要求、验证上传的图片是否有效等等。
在使用clean()
函数时,我们一般需要在forms.py
文件中先定义一个继承自forms.Form
的表单类。在这个类中,我们可以自定义clean()
函数来实现数据的验证和转换。下面是一个使用clean()
的示例代码:
from django import forms
class LoginForm(forms.Form):
username = forms.CharField(label='用户名', max_length=20)
password = forms.CharField(label='密码', widget=forms.PasswordInput())
def clean(self):
cleaned_data = super(LoginForm, self).clean()
username = cleaned_data.get('username')
password = cleaned_data.get('password')
if not username:
raise forms.ValidationError('用户名不能为空!')
if not password:
raise forms.ValidationError('密码不能为空!')
if len(password) < 6:
raise forms.ValidationError('密码长度不能小于6位!')
在上面的代码中,我们定义了一个LoginForm
类,并重载了clean()
函数。在clean()
函数中,我们通过调用父类的clean()
函数来获取经过Django验证之后的数据,并使用get()
方法从cleaned_data
中获取username
和password
这两个字段的值,这里使用get()
方法可以避免出现KeyError
的错误。接下来,我们对username
和password
进行验证,如果验证不通过,就使用raise
语句抛出一个forms.ValidationError
异常。
说明一下,clean()
函数中的验证错误信息会保存在表单对象的errors属性中,并显示在HTML页面的表单上。
下面再举一个例子,演示如何使用clean()
函数对上传的图片进行验证和转换:
from django import forms
class UploadFileForm(forms.Form):
title = forms.CharField(max_length=50)
file = forms.ImageField()
def clean_file(self):
file = self.cleaned_data['file']
try:
width, height = get_image_dimensions(file)
except:
raise forms.ValidationError('上传的图片无效!')
if width > 1024 or height > 1024:
raise forms.ValidationError('上传的图片不允许超过1024x1024像素!')
return file
在这个例子中,我们定义了一个UploadFileForm
类,并使用ImageField
类型定义了一个file
字段。在clean_file()
函数中,我们从表单对象的cleaned_data
属性中获取file
字段的值,并使用get_image_dimensions()
函数对图片进行尺寸验证。如果验证不通过,就使用raise
语句抛出一个forms.ValidationError
异常。如果验证通过,则返回file
字段的值。
总之,使用clean()
函数可以让我们更加方便快捷地实现表单的数据验证和转换,提高网站的安全性和用户体验。