19 - Form表单验证

发布时间 2023-03-28 18:40:39作者: 测试圈的彭于晏

1. 创建forms.py工具

# 和数据库没有任何关系,用来验证用户输入是否满足要求,需要和模板中参数名一致
# 用户自定义表单
from django import forms
from django.core.exceptions import ValidationError


class RegisterForm(forms.Form):
    # 和数据库没有任何关系,用来验证用户输入是否满足要求,需要和模板中参数名一致
    # required=True:必须输入
    username = forms.CharField(min_length=3, required=True, error_messages={
        'required': "用户名必须输入",
        'min_length': "用户名最小3个字符"
    })

    password = forms.CharField(min_length=6, required=True, error_messages={
        'required': "密码必须输入",
        'min_length': "密码最小6个字符"
    })

    confirm = forms.CharField(min_length=6, required=True, error_messages={
        'required': "密码必须输入",
        'min_length': "密码最小6个字符"
    })

    regtime = forms.DateTimeField(required=False, error_messages={
        'invalid': '日期格式错误',
    })

    sex = forms.BooleanField(required=False)

    # 单个字段验证: clean_xxx
    def clean_password(self):
        password = self.cleaned_data.get("password")
        if password and password.isdigit():
            raise ValidationError("密码不能是纯数字")
        return password
    #
    # 全局验证
    def clean(self):
        password = self.cleaned_data.get("password", None)
        confirm = self.cleaned_data.get("confirm", '')
        print(password, confirm)
        if password != confirm:
            raise ValidationError({"confirm": "两次密码不一致"})
        return self.cleaned_data

2. views中验证

def register(request):
    if request.method == "POST":
        # 用提交的数据生成表单
        form = RegisterForm(request.POST)  # 调用forms
        # 能通过验证返回True,否则返回False
        if form.is_valid():
            # 进行业务处理
            data = form.cleaned_data
            data.pop("confirm")
            # 获取指定字段
            # username = form.cleaned_data.get('username', '')
            # print(username, data)
            # 如果forms中表单的字段名和models模型字段名一致
            res = User.objects.create(**data)
            if res:
                return HttpResponse("注册成功")
        else:
            # 验证不成功,把错误信息渲染到前端页面
            return render(request, "register.html", {"form": form})

    return render(request, "register.html")

3. 前端提交表单和展示错误信息

<body>
<form action="{% url 'App04:register' %}" method="post">
    {% csrf_token %}
    用户名:<input type="text" name="username">
    {% for error in form.username.errors %}
        {{ error }}
    {% endfor %}
    <br>
    密码:<input type="password" name="password">
    {{ form.password.errors }}
    <br>
    确认密码:<input type="password" name="confirm">
    {{ form.confirm.errors }}
    <br>
    注册时间:<input type="text" name="regtime">
    {{ form.regtime.errors }}
    <br>
    性别:<input type="radio" name="sex" value="0">女
    <input type="radio" name="sex" value="1">男
    {{ form.sex.errors }}
    <br>
    <input type="submit" value="注册">
</form>
</body>