• (32)forms组件(数据校验)


    forms组件的用处

    1、就是用来做数据校验的

    2、渲染页面

    3、渲染错误信息(和局部刷新同效果)

    数据校验

    要使用forms组件必须要写一个类继承forms组件

    urls.py

    from bbs01 import views
    urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'register/$',views.RegForms.register),
    ]

    views.py

    from django.shortcuts import render,HttpResponse
    from django import forms #导入forms组件

    class RegForms(forms.Form):
    '''写要校验的字段'''
    name = forms.CharField(min_length=3,max_length=8) #forms.CharField()这是一个对象,就是用这个对象来校验name,最小长度3,最大长度8
    pwd = forms.CharField(min_length=3,max_length=8)
    re_pwd = forms.CharField(min_length=3,max_length=8)
    email = forms.EmailField() #这个对象校验的必须是email格式
    '''如果前端多传的字段,则再这里后端不会校验,多传的字段会被清洗掉
    如果少传了,则会不通过校验
    '''

    def register(request):
    if request.method == 'GET':
    return render(request,'register.html')
    elif request.method == 'POST':
    '''生成一个forms对象,传入一个字典'''
    forms = RegForms(request.POST) #要检验数据的话,就要在实例化时候传入对象
    '''调用forms对象'''
    if forms.is_valid(): #调用is_valid校验,合法就是返回True,不合法就是返回False
    '''cleaned_data清洗后的数据,就是通过的数据都存在这里面,是一个字典'''
    print('这里就是清洗后的数据: ',forms.cleaned_data)
    else:
    '''errors也是一个字典,错误的数据放这里面'''
    errors_dic = forms.errors
    print(errors_dic) #这个列表是底层做过处理和拼接的,有点难看懂
    print('这里就是错误的数据: ',forms.errors.as_data) #要查看这个错误的信息字典,要用errors.data,这样就可以看懂

    return HttpResponse('。。。。。。。。。。。。。')

    register.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>注册页面</title>
    </head>
    <body>
    <form action="" method="post">
    {% csrf_token %}
    <p>用户名:<input type="text" name="name"></p>
    <p>密码: <input type="password" name="pwd"></p>
    <p>确认密码: <input type="password" name="re_pwd"></p>
    <p>email: <input type="text" name="email"></p>
    <p>xxx: <input type="text" name="xxx"></p>
    <input type="submit" value="提交">
    </form>
    </body>
    </html>

    渲染页面

    渲染页面第一种方式 

    urls.py

    from bbs01 import views
    urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'register/$',views.RegForms.register),
    ]

    views.py

    from django.shortcuts import render,HttpResponse
    from django import forms #导入forms组件

    class RegForms(forms.Form):
    '''写要校验的字段'''
    name = forms.CharField(min_length=3,max_length=8) #forms.CharField()这是一个对象,就是用这个对象来校验name,最小长度3,最大长度8
    pwd = forms.CharField(min_length=3,max_length=8)
    re_pwd = forms.CharField(min_length=3,max_length=8)
    email = forms.EmailField() #这个对象校验的必须是email格式

    def register(request):
    if request.method == 'GET':
    return render(request,'register.html')
    elif request.method == 'POST':
    '''生成一个forms对象,传入一个字典'''
    forms = RegForms(request.POST) #要检验数据的话,就要在实例化时候传入对象
    '''调用forms对象'''
    if forms.is_valid(): #调用is_valid校验,合法就是返回True,不合法就是返回False
    '''cleaned_data清洗后的数据,就是通过的数据都存在这里面,是一个字典'''
    print('这里就是清洗后的数据: ',forms.cleaned_data)
    else:
    '''errors也是一个字典,错误的数据放这里面'''
    errors_dic = forms.errors
    print(errors_dic) #这个列表是底层做过处理和拼接的,有点难看懂
    print('这里就是错误的数据: ',forms.errors.as_data) #要查看这个错误的信息字典,要用errors.data,这样就可以看懂

    return HttpResponse('。。。。。。。。。。。。。')

    register.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>注册页面</title>
    </head>
    <body>
    <h1>渲染页面的第一种方式</h1>
    <h5>自动生成用户登陆的界面</h5>
    <form action="" method="post">
    {% csrf_token %}
    <p>用户名:{{ forms.name }}</p>
    <p>密码: {{ forms.pwd }}</p>
    <p>确认密码: {{ forms.re_pwd }}</p>
    <p>email: {{ forms.email }}</p>
    <input type="submit" value="提交">
    </form>
    </body>
    </html>

    渲染页面的第二种方式 forms循环的方式 (推荐这种方式,代码量少,可控性高)

    urls.py

    from bbs01 import views
    urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'register/$',views.RegForms.register),
    ]

    views.py

    from django.shortcuts import render,HttpResponse

    from django import forms
    class RegForms(forms.Form):
    '''渲染页面的第二种方式,这里后面的参数要传一个lable,就是将name在前端显示中文名,不设定lable则默认用变量名'''
    name = forms.CharField(min_length=3,max_length=8,label='用户名')
    pwd = forms.CharField(min_length=3,max_length=8,label='密码')
    re_pwd = forms.CharField(min_length=3,max_length=8,label='确认密码')
    email = forms.EmailField(label='邮箱')

    def register(request):
    if request.method == 'GET':
    forms = RegForms()
    return render(request,'register.html',{'forms':forms})
    elif request.method == 'POST':
    forms = RegForms(request.POST)
    if forms.is_valid():
    print('这里就是清洗后的数据: ',forms.cleaned_data)
    else:
    errors_dic = forms.errors
    print(errors_dic)
    print('这里就是错误的数据: ',forms.errors.as_data)

    return HttpResponse('。。。。。。。。。。。。。')

    register.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>注册页面</title>
    </head>
    <body>
    <h1>渲染页面的第二种方式</h1>
    <form action="" method="post">
    {% csrf_token %}
    {% for form in forms %}
    {#这里从后端取输入框对应的名字用lable#}
    <p>{{ form.label }}:{{ form }}</p>
    {% endfor %}
    </form>
    </body>
    </html>

    渲染错误信息

    PS:每一个对象里面都有一个errors错误信息

    register.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>注册页面</title>
    <style>
    .errors {
    color: red;
    margin-left: 20px;
    }
    </style>
    </head>
    <body>
    <h1>forms渲染页面,实现局部刷新</h1>
    <form action="" method="post" novalidate>
    {% csrf_token %}
    {% for form in forms %}
    {#每一个对象中都有一个错误信息,这去对象中的errors就是获得对象的错误信息,然后取0就是最近的一个,这样不会换行,否则程序会自动将错误信息放入li列表中换行#}
    <p>{{ form.label }}:{{ form }}<span class="errors">{{ form.errors.0 }}</span></p>
    {% endfor %}
    <input type="submit" value="提交">
    </form>
    </body>
    </html>

    views.py

    from django.shortcuts import render,HttpResponse

    from django import forms

    class RegForms(forms.Form):
    '''渲染页面的错误信息是中文,这里要传入一个字典,设定参数对应的显示值'''
    name = forms.CharField(min_length=3,max_length=8,label='用户名',error_messages={'min_length':'用户名太短','max_length': '用户名太长了','required':'该字段必填'})
    pwd = forms.CharField(min_length=3,max_length=8,label='密码',error_messages={'min_length':'用户名太短','max_length': '用户名太长了','required':'该字段必填'})
    re_pwd = forms.CharField(min_length=3,max_length=8,label='确认密码',error_messages={'min_length':'用户名太短','max_length': '用户名太长了','required':'该字段必填'})
    email = forms.EmailField(label='邮箱',error_messages={'invalid':'格式不是邮箱格式','required':'该字段必填'})

    def register(request):
    if request.method == 'GET':
    forms = RegForms()
    elif request.method == 'POST':
    forms = RegForms(request.POST)
    if forms.is_valid():
    print('这里就是清洗后的数据: ',forms.cleaned_data)
    return HttpResponse('注册成功')
    else:
    errors_dic = forms.errors
    print(errors_dic)
    print('这里就是错误的数据: ',forms.errors.as_data)

    return render(request,'register.html',{'forms':forms})
  • 相关阅读:
    HDU 1540 Tunnel Warfare (线段树区间合并)
    P2258 子矩阵
    P5021 赛道修建
    P4084 [USACO17DEC]Barn Painting
    P3914 染色计数
    比赛用模板
    P3594 [POI2015]WIL-Wilcze doły
    P5022 旅行
    P3952 时间复杂度
    P3960 列队
  • 原文地址:https://www.cnblogs.com/shizhengquan/p/10593912.html
Copyright © 2020-2023  润新知