下面是Django的clean()函数的作用与使用方法的完整攻略。
- clean()函数的作用
clean()函数是Django表单中的一个重要函数,其主要功能是对表单提交数据进行验证和清理,在保存数据前对数据进行预处理和清洗。
它的作用主要有两个:
- 数据验证(data validation),在表单提交前对数据进行验证,防止用户输入不合法的数据,有效保证数据的准确性和安全性;
-
数据清理和预处理(data cleaning and pre-processing),对提交的数据进行清洗和预处理,将数据转化为程序易于处理的合适的格式,例如将输入的数值转化为数字类型或日期类型。
-
clean()函数的使用方法
2.1 clean()函数的基本用法
在Django的表单中,可以通过继承django.forms.forms.Form
或django.forms.ModelForm
并重写其clean()
方法来实现表单数据的验证和清洗。例如以下是一个简单的示例:
from django import forms
class ContactForm(forms.Form):
name = forms.CharField(max_length=100)
email = forms.EmailField()
message = forms.CharField(widget=forms.Textarea)
def clean(self):
cleaned_data = super(ContactForm, self).clean()
name = cleaned_data.get('name')
email = cleaned_data.get('email')
message = cleaned_data.get('message')
在上面的示例中,我们定义了一个ContactForm
表单,其中包含了姓名、电子邮件和消息三个字段。在表单验证和清理时,我们需要对这三个字段进行检查。clean()
函数首先调用 super()
函数获取数据,检查每个数据是否满足要求,如果不满足,raise ValidationError
异常,如果满足,将数据返回给视图处理。
2.2 clean()函数的高级用法
除了基本的用法,clean()
函数还可以实现一些高级的功能,例如:
- 针对特定字段进行验证;
- 对多个字段进行联合验证。
以下我们分别对这两种情况进行举例说明:
2.2.1 针对特定字段进行验证
在某些情况下,我们需要对表单中的特定字段进行单独的验证,例如要求密码长度不能小于8个字符,或者要求用户输入的电话号码必须是11位数字等。在这种情况下,我们需要重载˙clean_<fieldname>()
方法来验证特定的字段。例如:
from django import forms
class ContactForm(forms.Form):
name = forms.CharField(max_length=100)
email = forms.EmailField()
message = forms.CharField(widget=forms.Textarea)
password = forms.CharField(widget=forms.PasswordInput())
def clean_password(self):
password = self.cleaned_data.get('password')
if len(password) < 8:
raise forms.ValidationError('密码长度必须为8个字符或更多。')
return password
在上面的例子中,我们重载了clean_password()
方法,对输入的密码进行长度验证。如果密码长度小于8,则会raise一个ValidationError
异常并返回相应的错误信息。
2.2.2 对多个字段进行联合验证
有些情况下,我们需要对多个字段进行联合验证,例如输入的开始时间必须早于结束时间,或者输入的手机号码和邮箱地址不能同时为空等。在这种情况下,我们可以通过定义clean()
函数来实现。例如:
from django import forms
class ContactForm(forms.Form):
start_time = forms.DateTimeField()
end_time = forms.DateTimeField()
phone = forms.CharField(required=False)
email = forms.EmailField(required=False)
def clean(self):
cleaned_data = super(ContactForm, self).clean()
start_time = cleaned_data.get('start_time')
end_time = cleaned_data.get('end_time')
phone = cleaned_data.get('phone')
email = cleaned_data.get('email')
if start_time and end_time and start_time >= end_time:
msg = '开始时间必须早于结束时间。'
self.add_error('start_time', msg)
self.add_error('end_time', msg)
if not phone and not email:
msg = '手机号码和邮箱地址不能同时为空。'
self.add_error('phone', msg)
self.add_error('email', msg)
在上面的例子中,我们定义了一个clean()
函数,对开始时间和结束时间进行联合验证,并对手机号码和邮箱地址进行必须输入的判断。Add_error()函数用于向表单添加错误信息。
以上就是Django的clean()函数的作用、使用方法以及相关示例。