• django基础之day09,创建一个forms表单组件进行表单校验,知识点:error_messages,label,required,invalid,局部钩子函数,全局钩子函数, forms_obj.cleaned_data,forms_obj.errors,locals(), {{ forms.label }}:{{ forms }},{{ forms.errors.0 }}


    利用forms表单组件进行表单校验,完成用户名,密码,确认密码,邮箱功能的校验

    该作业包含了下面的知识点:
    error_messages,label,required,invalid,局部钩子函数,全局钩子函数,
    forms_obj.cleaned_data,forms_obj.errors,locals(),
    {{ forms.label }}:{{ forms }},{{ forms.errors.0 }}

    urls.py文件

    添加index访问路径
    
    
    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^register/', views.register),
        url(r'^index/', views.index),
    
    ]
    
    

    views.py文件

    创建视图函数

    
    #***************************forms组件************************
    # 使用forms组件,完成数据校验,展示错误信息
    # 使用forms组件的前提是,你需要提前写一个类
    
    from django import forms
    from django.core.validators import RegexValidator
    
    
    class MyForm(forms.Form):
        # username字段,最少三位,最多八位
        username = forms.CharField(max_length=8, min_length=3, label='用户名',
                                   error_messages={
                                       'max_length': '用户名最长八位',
                                       'min_length': '用户名最少三位',
                                       'required': '用户名不能为空',
                                   }
                                   )
        # password字段,最少三位,最多八位
        password = forms.CharField(max_length=8, min_length=3, label='密码',
                                   error_messages={
                                       'max_length': '密码最多8位',
                                       'min_length': '密码最少3位',
                                       'required': '密码不能为空'
                                   }
                                   )
    
        confirm_password = forms.CharField(max_length=8, min_length=3, label='确认密码',
                                   error_messages={
                                       'max_length': '确认密码最多8位',
                                       'min_length': '确认密码最少3位',
                                       'required': '确认密码不能为空'
                                   }
                                   )
        # email字段,必须是邮箱格式
        email = forms.EmailField(label='邮箱', error_messages={
            'required': '邮箱不能为空',  # required,校验不能为空的固定用法
            'invalid': '邮箱格式错误',  # invalid,专门用来校验邮箱格式错误的固定用法
    
        })
    
        #********************************************************************************
        #校验用户名中不能含有666,校验单个字段使用局部钩子函数,
        #钩子函数是校验规则中最后执行的一道关卡,会先执行上面的校验规则,上面都校验通过了,
        # 才会走到钩子函数这一层的校验来。
        def clean_username(self):
            # username=self.cleaned_data  #是一个校验通过的大字典
            # 通过的字典支持点get取值的方式,专门拿出来要校验的字段
            username=self.cleaned_data.get('username')
            if '666' in username:
                #如何给username所对应的框展示错误信息呢?
                #注意下面是钩子函数的固定用法,添加对应字段的错误提示信息
                self.add_error('username','光喊666是不行的')
    
            #将username数据返回,这个地方是必须要返回字段数据的,缺失不可
            return username
        #********************************************************************************
        #校验密码和确认密码是否一致      这个就要用到全局钩子函数
        def clean(self):
            password=self.cleaned_data.get('password')
            confirm_password=self.cleaned_data.get('confirm_password')
            if not password == confirm_password:
                #注意下面是钩子函数的固定用法,添加对应字段的错误提示信息
                self.add_error('confirm_password','两次密码不一致')
            #全局钩子是需要将全局的数据全部返回
            return self.cleaned_data
    
    
    
    
    
    
    
        '''
        1.label='xxx'是对应的input输入框前面的提示文字
        2.error_messages={
           'max_length':'密码最多8位',
           'min_length':'密码最少3位',
           'required':'密码不能为空'
        }   
        这个是固定格式,必填项必须用required也是固定的用法
        3.required,校验不能为空的固定用法
        4.invalid,专门用来校验邮箱格式错误的固定用法
        '''
    
    
    def index(request):
        '''  渲染标签:
        第一步,需要生成一个空的forms_obj,MyForm类的对象
        第二步,通过locals()和render方法渲染到前端index页面
        '''
        forms_obj = MyForm()
        # 后端如何校验前端用户传入的数据
        if request.method == 'POST':
            
            # 获取用户的数据,request.POST正好是一个字典,
            # request.POST作为该类的参数传入MyForm()类中,
            # 然后再交给Forms组件来校验数据
            # 注意事项,这两个forms_obj对象必须要书写一致
            forms_obj = MyForm(request.POST)
            if forms_obj.is_valid():
                print(forms_obj.cleaned_data)  # 打印成功的数据
                return HttpResponse('数据全部OK')
    
            else:
                print(forms_obj.errors)  # 打印错误的数据
    			
    	return render(request, 'index.html', locals())
    	
    	
    	
    	
    
        '''
        获取用户的数据 request.POST正好是一个字典
        检验数据神6条中的第二条:
            2.给写好的类,传字典数据(代校验的数据,生成一个代校验对象)
            form_obj=views.MyForm({'username':'jason','password':123,'email':'123@'})
        
        '''
    
        # print(type(forms_obj))
        # print('我是',forms_obj)
        # for forms in forms_obj:
        #     print('我是',forms)
        '''
        forms 相关打印结果:
        我是 < input
        type = "text"
        name = "username"
        maxlength = "8"
        minlength = "3"
        required
        id = "id_username" / >
        '''
        # 直接将生成的对象,传递给前端页面
        #return render(request, 'index.html', locals())
    
    
    

    index.html文件

    
    <form action="" method="post" novalidate>
        {% for forms in forms_obj %}
    
            <p>
                {{ forms.label }}:{{ forms }}
                <span>{{ forms.errors.0 }}</span>
            </p>
    
            {#        <span>{{ forms.label }}</span>  #}
            {#        <span>{{ forms }}</span>#}
            {#   {{ forms.label }}是标签前面的注释,举例:input输入框前面的用户名,密码,年龄这些文字提示     #}
            {#   {{ forms }} 是表单中所有的输入框   #}
            {#   {{ forms.errors.0 }} 是固定用法,获取表单提交中的错误字段详细信息,咱后端或者前端页面都可以查看     #}
        {% endfor %}
    
        <input type="submit">
    </form>
    
    
    
    
    
    
    
    
  • 相关阅读:
    Python入门系列——第20篇
    Python入门系列——第19篇
    windows下python使用pip命令安装builtwith库时,遇到的utf-8问题的解决
    Python入门系列——第18篇
    在相同的主机上创建一个duplicate数据库
    duplicate database的时候,rman连接 auxiliary database的后状态不正确
    使用duplicate target database ... from active database复制数据库
    RHEL7
    Oracle 监听器日志文件过大导致监听异常
    TNS-01251: Cannot set trace/log directory under ADR
  • 原文地址:https://www.cnblogs.com/ludundun/p/11991933.html
Copyright © 2020-2023  润新知