第三百一十一节,Django框架,Form表单验证


第三百一十一节,Django框架,Form表单验证

表单提交

html

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
    <link rel="stylesheet" type="text/css" href="/static/css/tou.css">
head>
<body>
<form action="/bugarticles/" method="post">
    <div>
        <input type="text" name="user"/>
    div>
    <div>
        <input type="text" name="pwd"/>
    div>
    <div>
        <input type="submit" value="提交"/>
    div>
form>
body>
html>

路由映射

urlpatterns = [
    url(r'admin/', admin.site.urls),   #路由映射admin数据库管理
    url(r'articles/', views.special)    
]

逻辑处理

method属性获取用户请求方式,post或者get
使用方式:请求对象.method

POST获取用户post请求方式的信息
使用方式:请求对象.POST

POST.get()获取用户POST请求方式的表单name名称对应的值,参数是表单name名

from django.shortcuts import render
from app1.models import *    #导入数据库操作模块

#逻辑处理模块
def special(request):                #自定义参数接收用户请求对象
    if request.method == "POST":         #判断用户请求如果是post方式
        print(request.POST.get('user',None))  #接收用户表单提交的name名称对应的值
        print(request.POST.get('pwd', None))  #接收用户表单提交的name名称对应的值
    return render(request, 'app1/index.html', locals())  # 打开页面

表单提交验证,获取数据与获取错误信息

1、创建表单验证模块,必须继承Django的表单验证forms.Form类

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#表单验证
from django import forms        #导入Django的表单验证模块

class yhbd(forms.Form):         #自定义验证表单类,继承Django的表单验证类
    user = forms.CharField()    #接收逻辑处理时,创建yhbd类时传进来的POST对象,里的表单name名对应的值进行验证
    pwd = forms.CharField()     ##接收逻辑处理时,创建yhbd类时传进来的POST对象,里的表单name名对应的值进行验证

2、逻辑处理,创建表单验证模块里的验证类,并将用户请求的POST对象,传入验证类进行验证,验证后获取验证通过的提交信息,或者验证没通过的错误信息

如果出现错误,将错误信息对象以字典方式传到html页面

is_valid()返回验证是否通过的布尔值
使用方式:验证类.is_valid()

cleaned_data获取验证通过后的所有提交数据,返回字典
使用方式:验证类.cleaned_data

errors获取验证错误信息,返回所有表单的错误信息对象
使用方法:验证类.errors

from django.shortcuts import render
from app1.models import *    #导入数据库操作模块
from app1.biaodan import *   #导入自定义表单验证模块
#逻辑处理模块
def special(request):
    if request.method == 'GET':
        return render(request, 'app1/index.html', locals())  # 打开页面

    if request.method == "POST":
        # print(request.POST.get('user',None))          #接收用户表单提交的name名称对应的值
        # print(request.POST.get('pwd', None))          #接收用户表单提交的name名称对应的值

        f = yhbd(request.POST)                          #创建验证表单类,将用户请求POST对象传进表单验证类进行验证

        # ret = f.is_valid()                            #返回验证是否通过
        # print(ret)                                    #返回布尔值

        if f.is_valid():                                #判断验证如果通过
            print(f.cleaned_data)                       #获取到用户提交信息,字典方式
        else:                                           #如果没通过
            print(f.errors)                             #获取错误对象

        return render(request, 'app1/index.html',{'cuow':f.errors})  # 打开页面,将错误信息用字典方式传到html页面

3、在html页面接收逻辑处理以字典形式传过来的错误对象,分别获取不同表单的错误信息

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
    <link rel="stylesheet" type="text/css" href="/static/css/tou.css">
head>
<body>

<form action="/bugarticles/" method="post">
    <div>
        <input type="text" name="user"/>
        <span>{{ cuow.user.0 }}span>     
    div>
    <div>
        <input type="text" name="pwd"/>
        <span>{{ cuow.pwd.0 }}span>      
    div>
    <div>
        <input type="submit" value="提交"/>
    div>
form>
body>
html>

利用表单类自动创建表单标签

以上表单的是我们自己手动写的,还可以用表单类来自动创建表单标签,好处是不用自己写表单标签,还有就是当用户填写的表单不合法提交时提示错误信息不清空表单

注意:表单类根据字段创建的表单标签,当用户输入内容时,首先要经过浏览器默认行为的表单验证,如果浏览器默认行为的表单验证都没有通过那么将无法提交

浏览器默认行为的表单验证,通过了在进行我们定义的表单类验证,验证合法获取用户提交信息,不合法返回错误信息

利用表单类自动创建表单标签

1、首先在get访问页面时,创建表单类不传参数,然后把这个表单类传到html页面,在html页面通过,表单类.字段名称,来自动创建表单标签

  每一种表单字段类型,都有一个默认的表单标签,这个标签是可以更改的,所以表单类可以创建任何表单标签

2、在post访问时,再次创建表单类需要传参,将post请求对象传入表单类进行验证表单,如果表单不合法,将错误信息对象传到html显示错误信息,将这次创建的表单类传到html页面替换get时创建的表单类

逻辑处理

from django.shortcuts import render
from app1.models import *    #导入数据库操作模块
from app1.biaodan import *   #导入自定义表单验证模块
#逻辑处理模块
def special(request):
    if request.method == 'GET':
        f = yhbd()                                            #创建表单验证类,不传参
        return render(request, 'app1/index.html',{'form':f})  # 打开页面,并将表单验证类传到html生成表单标签

    if request.method == "POST":
        f = yhbd(request.POST)                          #创建验证表单类,将用户请求POST对象传进表单验证类进行验证

        if f.is_valid():                                #判断验证如果通过
            print(f.cleaned_data)                       #获取到用户提交信息,字典方式
        else:                                           #如果没通过
            # print(f.errors)                           #获取错误对象
            pass

        return render(request, 'app1/index.html',{'cuow':f.errors,'form':f})  # 打开页面,将错误信息用字典方式传到html页面,并且将表单类传到html页面替换没传参的表单验证类

html

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
    <link rel="stylesheet" type="text/css" href="/static/css/tou.css">
head>
<body>

<form action="/bugarticles/" method="post">
    <div>
        {{ form.user }}                                     
        {% if cuow.user.0 %}
            <span class="cuow">{{ cuow.user.0 }}span>     
        {% endif %}
    div>
    <div>
        {{ form.pwd }}                                      
        {% if cuow.pwd.0 %}
            <span class="cuow">{{ cuow.pwd.0 }}span>      
        {% endif %}
    div>
    <div>
        <input type="submit" value="提交"/>
    div>
form>
body>
html>

常用的内置验证字段

EmailField()验证邮箱字段
CharField()验证字符串字段
URLField()验证url地址字段
IntegerField()验证数字字段
GenericIPAddressField()验证IP字段

注意:虽然有很多内置验证字段,但是我们还是要根据我们自己的需求来验证,所以

验证字段的参数

required设置字段是否可以为空
  True不可以为空
  False可以为空

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#表单验证
from django import forms        #导入Django的表单验证模块

class yhbd(forms.Form):         #自定义验证表单类,继承Django的表单验证类
    user = forms.CharField(required=True)   #True不可以为空
    pwd = forms.CharField()

max_length最大字符数
min_length最小字符数

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#表单验证
from django import forms        #导入Django的表单验证模块

class yhbd(forms.Form):         #自定义验证表单类,继承Django的表单验证类
    user = forms.CharField(max_length=4,min_length=2)
    pwd = forms.CharField()

error_messages自定义错误提示信息
  参数是一个字典{'验证名称':'错误提示'}

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#表单验证
from django import forms        #导入Django的表单验证模块

class yhbd(forms.Form):         #自定义验证表单类,继承Django的表单验证类
    user = forms.CharField(
        required=True,
        max_length=4,
        min_length=2,
        error_messages={
            'required':'用户名不能为空',
            'max_length':'最大长度不得超过4个字符',
            'min_length':'最小长度不得少于2个字符'
        }
    )
    pwd = forms.CharField()

invalid设置邮箱格式错误提示信息

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#表单验证
from django import forms        #导入Django的表单验证模块

class yhbd(forms.Form):         #自定义验证表单类,继承Django的表单验证类
    user = forms.CharField(
        required=True,
        max_length=4,
        min_length=2,
        error_messages={
            'required':'用户名不能为空',
            'max_length':'最大长度不得超过4个字符',
            'min_length':'最小长度不得少于2个字符'
        }
    )
    pwd = forms.EmailField(
        error_messages={
            'required': '邮箱不能为空',
            'invalid':'邮箱格式不正确'
        }
    )

widget设置表单字段在html页面的类型
  使用方式:widget=forms.Textarea()
  Textarea():