Django—Form表单-重写验证(注册案例)

  • forms.py


    from django import  forms
    from django.core.exceptions import ValidationError
    from django.forms.utils import ErrorList
    
    
    class RegisterForm(forms.Form):
        def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
                     initial=None, error_class=ErrorList, label_suffix=None,
                     empty_permitted=False, field_order=None, use_required_attribute=None, renderer=None,request=None):
            super().__init__(data,files,auto_id,prefix,label_suffix,empty_permitted,field_order,use_required_attribute,renderer)
            self.request = request
    
        username = forms.CharField(min_length=3,required=True,error_messages={
            'required':'用户名必须输入',
            'min_length':'用户名至少3个字符'
        })
        password = forms.CharField(min_length=3,required=True,error_messages={
            'required': '密码名必须输入',
            'min_length': '密码至少3个字符'
        })
        confirm = forms.CharField(min_length=3,required=True,error_messages={
            'required': '密码名必须输入',
            'min_length': '密码至少3个字符'
        })
        regtime = forms.DateTimeField(required=False,error_messages={
            'invalid':'日期格式错误',
        })
        sex = forms.BooleanField(required=False)
    
        # 单个字段验证: clean_xxxx
        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
    
  • views.py


    from django.contrib.auth import authenticate, login,logout
    from django.contrib.auth.decorators import login_required
    from django.http import HttpResponse
    from django.shortcuts import render, redirect
    
    # Create your views here.
    from django.urls import reverse
    
    from App02.forms import RegisterForm
    from App02.models import User
    
    
    def register(request):
        if request.method == "POST":
            # 用提交的数据生成表单
            form =RegisterForm(request.POST)
            # 能通过验证,返回True,否则返回False
            if form.is_valid():
                # 进行业务处理
                data = form.cleaned_data
                data.pop("confirm")
                # 获取指定字段
                # username = form.cleaned_data.get('username','')
                # print(data,type(data))
                # 如果forms中表单的字段名和models模型的字段名一致
                res = User.objects.create(**data)
                # 如果forms中表单的字段名和models模型的字段名不一致
                # res = User.objects.create(username=username,password=form.cleaned_data.get('password'))
                if res:
                    return HttpResponse("注册成功")
            else:
                print(form.__dict__)
                # 验证不成功,把错误信息渲染到前端页面
                return render(request, "register.html",{'form':form})
        return render(request,"register.html")
  • html


    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>注册</title>
    </head>
    <body>
    <form action="{% url 'App02:user_register' %}" method="post">
        {% csrf_token %}
        用户名:<input type="text" name="username">
        {% for error in form.username.errors %}
            <span>{{ error }}</span>
        {% 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>
    </html>
发布了180 篇原创文章 · 获赞 6 · 访问量 2305

猜你喜欢

转载自blog.csdn.net/piduocheng0577/article/details/105019839
今日推荐