Django - 自定义Form校验规则
自定义Form校验规则
class MyForm(forms.Form):
    # form可以校验的规则
    username = fields.CharField(max_length=32,min_length=3)  
    password = fields.CharField(max_length=32,min_length=3)
    re_password = fields.CharField(max_length=32,min_length=3)   
局部钩子 - 校验用户名不能重复
def clean_username(self):
    # 获取username
    username = self.cleaned_data['username']
    # 判断用户名是否存在
    if models.User.objects.filter(username=username).count():
        # 存在即不符合规则,必须抛出ValidationError异常
        raise ValidationError('该用户名已存在')
    # 校验通过,则返回清洗后的数据
    return self.cleaned_data['username']
全局钩子 - 检验两次密码输入一致
def clean(self):
    # 获取两次输入的密码
    password = self.cleaned_data['password']
    re_password = self.cleaned_data['re_password']
    
    # 判断是否相等,相等则返回数据,否则抛出ValidationError异常
    if password == re_password:
        return self.cleaned_data
    else:
        raise ValidationError('两次密码输入不一致')  # 错误信息放在“__all__”里
from django import forms
from django.forms import widgets
from django.core.exceptions import ValidationError
from app01 import models
# 写一个类,继承Form  没有头像校验的字段
class RegForm(forms.Form):
    username = forms.CharField(max_length=18, min_length=3, label="用户名",
                               error_messages={'max_length': '太长了',
                                               'min_length': '太短了',
                                               'required': '不能为空'},
                               widget=widgets.TextInput(attrs={'class': 'form-control'}),
                               )
    password = forms.CharField(max_length=18, min_length=3, label="密码",
                               error_messages={'max_length': '太长了',
                                               'min_length': '太短了',
                                               'required': '不能为空'},
                               widget=widgets.PasswordInput(attrs={'class': 'form-control'}),
                               )
    re_pwd = forms.CharField(max_length=18, min_length=3, label="确认密码",
                             error_messages={'max_length': '太长了',
                                             'min_length': '太短了',
                                             'required': '不能为空'},
                             widget=widgets.PasswordInput(attrs={'class': 'form-control'}),
                             )
    email = forms.EmailField(max_length=18, min_length=3, label="邮箱",
                             error_messages={'max_length': '太长了',
                                             'min_length': '太短了',
                                             'required': '不能为空'},
                             widget=widgets.EmailInput(attrs={'class': 'form-control'}),
                             )
    # 局部钩子,局部校验
    def clean_username(self):
        # 取出name对应的值
        name = self.cleaned_data.get('username')
        # if name.startswith('sb'):
        #     #校验不通过,抛异常
        #     raise ValidationError('不能以sb开头')
        #     #校验通过,直接return name值
        # else:
        #     return name
        user = models.UserInfo.objects.filter(username=name).first()
        if user:
            # 用户存在,抛异常
            raise ValidationError('用户已经存在')
        else:
            return name
    # 全局钩子,全局校验
    def clean(self):
        pwd = self.cleaned_data.get('password')
        r_pwd = self.cleaned_data.get('re_pwd')
        if pwd == r_pwd:
            # 校验通过,返回清洗后的数据
            return self.cleaned_data
        else:
            # 校验不通过,抛异常
            raise ValidationError('两次密码不一致')
注意:全局钩子与局部钩子的函数名、判断异常和返回值都是根据内部源码写的
1. 函数名为“clean_字段名”或者“clean”
2. 数据校验有误,只能抛ValidationError异常,因为在源码中捕获ValidationError异常
3. 数据校验成功,返回数据
个性签名:独学而无友,则孤陋而寡闻!
如果觉得这篇文章对你有小小的帮助的话,记得点个“关注”哦,博主在此感谢!还可以扫码添加好友,交流编程上的问题哦!
万水千山总是情,点赞再走行不行!哈哈哈(っ•̀ω•́)っ✎⁾⁾!

                
            
        
浙公网安备 33010602011771号