详解Django的 clean() 函数:定义表单字段的清理行为

  • Post category:Python

Django中的clean()函数是Django表单中常用的一个方法,它是用来验证表单数据的函数。我们可以通过继承forms.Form类并重写clean()函数来实现表单数据的验证。clean()函数中的代码会在表单数据存储到cleaned_data中之前执行,如果数据验证未通过,那么我们可以通过raise forms.ValidationError()这个函数来抛出异常,以便为用户提供错误信息。

clean()函数的使用方法:

  1. 在表单类中继承forms.Form类,并在表单类中重写clean()函数,用于自定义表单数据的验证逻辑;
  2. 在重写的clean()函数中,通过验证表单数据的方法,判断表单数据是否符合规范;
  3. 如果表单数据不符合规范,则通过raise forms.ValidationError()函数抛出异常,并设置错误信息;
  4. 如果表单数据验证通过,则将验证后的数据存储到cleaned_data中,并将其返回。

下面是具体的两个实例:

实例1:验证表单中两次输入的密码必须一致

from django import forms

class UserForm(forms.Form):
    username = forms.CharField(label='用户名', max_length=50)
    password = forms.CharField(label='密码', widget=forms.PasswordInput())
    confirm_password = forms.CharField(label='确认密码', widget=forms.PasswordInput())

    def clean_confirm_password(self):
        password = self.cleaned_data['password']
        confirm_password = self.cleaned_data['confirm_password']
        if password and confirm_password and password != confirm_password:
            raise forms.ValidationError('两次密码输入不一致,请重新输入。')
        return confirm_password

上面的代码中,在UserForm表单类中重写了clean_confirm_password()方法,用于验证表单中两次输入密码是否一致。如果通过验证,则返回验证后的确认密码;否则抛出ValidationError异常。

实例2:验证表单中输入的日期是否早于今天

from django import forms
from django.utils.timezone import localtime, now

class DateForm(forms.Form):
    name = forms.CharField(label='姓名', max_length=50)
    date = forms.DateField(label='日期')

    def clean_date(self):
        input_date = self.cleaned_data['date']
        now_date = localtime(now()).date()
        if input_date >= now_date:
            raise forms.ValidationError('输入日期必须早于今天。')
        return input_date

上面的代码中,在DateForm表单类中重写了clean_date()方法,用于验证表单中的日期是否早于今天。如果通过验证,则返回验证后的日期;否则抛出ValidationError异常。