第三百一十一节,Django框架,Form表单验证
第三百一十一节,Django框架,Form表单验证
表单提交
html
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- <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>Title</title>
- <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> <!-- 接收错误信息里的user的错误信息 -->
- </div>
- <div>
- <input type="text" name="pwd"/>
- <span>{{ cuow.pwd.0 }}</span> <!-- 接收错误信息里的pwd的错误信息 -->
- </div>
- <div>
- <input type="submit" value="提交"/>
- </div>
- </form>
- </body>
- </html>
利用表单类自动创建表单标签
以上表单的<input>是我们自己手动写的,还可以用表单类来自动创建表单标签,好处是不用自己写表单标签,还有就是当用户填写的表单不合法提交时提示错误信息不清空表单
注意:表单类根据字段创建的表单标签,当用户输入内容时,首先要经过浏览器默认行为的表单验证,如果浏览器默认行为的表单验证都没有通过那么将无法提交
浏览器默认行为的表单验证,通过了在进行我们定义的表单类验证,验证合法获取用户提交信息,不合法返回错误信息
利用表单类自动创建表单标签
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>Title</title>
- <link rel="stylesheet" type="text/css" href="/static/css/tou.css">
- </head>
- <body>
- <form action="/bugarticles/" method="post">
- <div>
- {{ form.user }} <!-- 接收get请求时创建的表单类,生成表单标签 -->
- {% if cuow.user.0 %}
- <span class="cuow">{{ cuow.user.0 }}</span> <!-- 接收错误信息里的user的错误信息 -->
- {% endif %}
- </div>
- <div>
- {{ form.pwd }} <!-- 接收get请求时创建的表单类,生成表单标签 -->
- {% if cuow.pwd.0 %}
- <span class="cuow">{{ cuow.pwd.0 }}</span> <!-- 接收错误信息里的pwd的错误信息 -->
- {% 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(): <textarea>标签类型
TextInput():<input>标签类型
- #!/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(
- widget=forms.TextInput(),
- )
attrs给表单标签设置属性,可以给标签元素设置class样式,和input标签的各种type属性
- #!/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(
- widget=forms.TextInput(attrs={'type':'password','class':'c1'}),
- )
Select生成表单,select标签,下拉选项框
参数:
choices设置下拉数据,元组类型
attrs设置select标签属性
- #!/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个字符'
- }
- )
- zhi = (
- (0, '普通会员'),
- (1, '超级会员'),
- (2, '黄金会员'),
- (3, '白银会员'),
- (4, 'vip会员')
- )
- pwd = forms.CharField(
- widget=forms.widgets.Select(choices=zhi,attrs={'class':'c1'})
- )
下拉框结合数据库应用
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- #表单验证
- from django import forms #导入Django的表单验证模块
- from app1.models import * #导入数据库操作
- 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个字符'
- }
- )
- a = shengf.objects.all().values_list('id','shf') #获取数据库里shengf表里的id和shf字段的数据
- pwd = forms.CharField(
- widget=forms.widgets.Select(choices=a,attrs={'class':'c1'}) #将数据库的数据显示到下拉框
- )
下拉框结合数据库应用,防止数据库添加了数据,或者删除了数据,页面缓存了下拉框数据,无法事实数据同步
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- #表单验证
- from django import forms #导入Django的表单验证模块
- from app1.models import * #导入数据库操作
- 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个字符'
- }
- )
- a = shengf.objects.all().values_list('id','shf') #获取数据库里shengf表里的id和shf字段的数据
- pwd = forms.CharField(
- widget=forms.widgets.Select(choices=a,attrs={'class':'c1'}) #将数据库的数据显示到下拉框
- )
- #防止数据库添加了数据,或者删除了数据,页面缓存了下拉框数据,无法事实数据同步
- def __init__(self,*args, **kwargs): #创建类的__init__方法,每次创建类时都会执行
- super(yhbd,self).__init__(*args, **kwargs) #获取当前类的父类里的__init__方法执行
- a = shengf.objects.all().values_list('id', 'shf') #重新获取数据库里shengf表里的id和shf字段的数据
- self.fields['pwd'] = forms.CharField(widget=forms.widgets.Select(choices=a,attrs={'class':'c1'})) #更新一下表单pwd字段的数据
自定义验证规则
validators设置自定义验证规则,参数是一个列表,列表里是自定义验证方法名称
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- #表单验证
- from django import forms #导入Django的表单验证模块
- from django.core.exceptions import ValidationError
- import re
- 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个字符'
- }
- )
- #自定义验证规则
- def shouji(value):
- mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
- if not mobile_re.match(value):
- raise ValidationError('手机号码格式错误') #如果不匹配返回错误信息
- pwd = forms.CharField(
- validators=[shouji, ], #设置自定义验证规则
- required=True,
- widget=forms.TextInput(
- attrs={
- 'class': "cl",
- 'placeholder': u'手机号码'
- }
- ),
- error_messages={
- 'required':'手机不能为空',
- }
- )
其他
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- import re
- from django import forms
- from django.core.exceptions import ValidationError
- def mobile_validate(value):
- mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
- if not mobile_re.match(value):
- raise ValidationError('手机号码格式错误')
- class PublishForm(forms.Form):
- user_type_choice = (
- (0, u'普通用户'),
- (1, u'高级用户'),
- )
- user_type = forms.IntegerField(widget=forms.widgets.Select(choices=user_type_choice,
- attrs={'class': "form-control"}))
- title = forms.CharField(max_length=20,
- min_length=5,
- error_messages={'required': u'标题不能为空',
- 'min_length': u'标题最少为5个字符',
- 'max_length': u'标题最多为20个字符'},
- widget=forms.TextInput(attrs={'class': "form-control",
- 'placeholder': u'标题5-20个字符'}))
- memo = forms.CharField(required=False,
- max_length=256,
- widget=forms.widgets.Textarea(attrs={'class': "form-control no-radius", 'placeholder': u'详细描述', 'rows': 3}))
- phone = forms.CharField(validators=[mobile_validate, ],
- error_messages={'required': u'手机不能为空'},
- widget=forms.TextInput(attrs={'class': "form-control",
- 'placeholder': u'手机号码'}))
- email = forms.EmailField(required=False,
- error_messages={'required': u'邮箱不能为空','invalid': u'邮箱格式错误'},
- widget=forms.TextInput(attrs={'class': "form-control", 'placeholder': u'邮箱'}))
注意:如果表单是通过Ajax提交的,页面不刷新,那么html页面将无法获取到错误信息,那么我们只能将所有错误信息构造成字典,然后以json的方式返回给Ajax,添加到页面
将models数据库表类转换成表单验证类【必要使用】
这样可以少写表单验证代码,使用的是数据库字段的验证规则
models.py
- from django.db import models # 导入models对象
- class CourseOrg(models.Model):
- name = models.CharField(max_length=50, verbose_name='机构名称')
- desc = models.TextField(verbose_name='机构描述')
- category = models.CharField(max_length=20, verbose_name='机构类别', default='pxjg', choices=(('pxjg', '培训机构'), ('gx', '高校'), ('gr', '个人')))
- click = models.IntegerField(default=0, verbose_name='点击数')
- fav_nums = models.IntegerField(default=0, verbose_name='收藏数')
- image = models.ImageField(upload_to='org/%Y/%m', storage=ImageStorage(), verbose_name='封面图', max_length=100)
- address = models.CharField(max_length=150, verbose_name='机构地址')
- city = models.ForeignKey(CityDict, verbose_name='外键城市表')
- add_time = models.DateTimeField(default=datetime.now, verbose_name='添加日期')
- class Meta:
- verbose_name = '课程机构表'
- verbose_name_plural = verbose_name
- def __str__(self):
- return self.name
forms.py
- #!/usr/bin/env python
- # -*- coding:utf8 -*-
- from django import forms # 导入Django的表单验证模块
- from app_organization.models import CourseOrg # 导入数据库表类
- class CourseOrgForm(forms.ModelForm):
- zdyi = forms.CharField() # 自定义表单验证字段
- class Meta:
- model = CourseOrg # 设置要将数据库表类转换成表单验证类的名称
- fields = ['name','category','fav_nums'] # 要使用的字段
第三百一十一节,Django框架,Form表单验证的更多相关文章
- web框架-(六)Django补充---form表单验证
一.form表单验证 1. 常规html页面的form表单验证 常规页面中,如果想实现对表单中用户输入信息的数据验证,需要配合Ajax来实现. 使用前我们先来熟悉下函数参数:request,其中包含的 ...
- Day19 Django之Form表单验证、CSRF、Cookie、Session和Model操作
一.Form表单验证 用于做用户提交数据的验证1.自定义规则 a.自定义规则(类,字段名==html中的name值)b.数据提交-规则进行匹配代码如下: """day19 ...
- django之form表单验证
django中的Form一般有两种功能: 输入html 验证用户输入 #!/usr/bin/env python # -*- coding:utf- -*- import re from django ...
- Django框架form表单配合ajax注册
总结一下,其实form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 保留上次输入内容 下面是写的登录页面的实例 1:views视图中的代码 # 注册页面 def regi ...
- Django的Form表单验证
Form(from django import forms) 简短理解:后端提供了一个类:from django import forms,继承此类定义子类.子类中定义和form表单中提交到name名 ...
- Django之form表单验证顺序
概述 django框架提供了一个forms类,来处理web开发中的表单相关事项.众所周知,form最常做的是对用户输入的内容进行验证,为此django的forms类提供了全面的内容验证支持. 验证过程 ...
- Django框架form表单的那些事儿
Form那些事儿 创建Form类时,主要涉及到 [字段] 和 [插件],字段用于对用户请求数据的验证,插件用于自动生成HTML; 1:initial 初始值,input框里面的初始值. class L ...
- Django中的Form表单验证
回忆一下Form表单验证的逻辑: 前端有若干个input输入框,将用户输入内容,以字典传递给后端. 后端预先存在一个Form表单验证的基类,封装了一个检测用户输入是否全部通过的方法.该方法会先定义好错 ...
- python_way day19 HTML-day5 (form表单验证,CSRF,cookie,session,缓存)
python-way day19 1. dJango的form表单验证 2.CSRF 跨站请求伪造 3.cookie,session 4.缓存 一,django表单验证功能 1.django验证基础: ...
- 6.4-6.5 使用form表单验证,完善登录页面
之前是使用自定义的类来实现登录逻辑,现在使用django内置的form表单验证,用继承django的view来实现登录页面. users > views.py 的内容是: from django ...
随机推荐
- Python asin() 函数
描述 asin() 返回x的反正弦弧度值. 语法 以下是 asin() 方法的语法: import math math.asin(x) 注意:asin()是不能直接访问的,需要导入 math 模块,然 ...
- sqlserver把小数点后面多余的0去掉
Sql中想把小数点后多余的0去掉,怎么办? select 5000/10000.0 --想变成0.5select 5500/10000.0 --想变成0.55select 5550/10000.0 - ...
- ubuntu为python处理图片安装图片数据增强库imgaug
1 依赖Required dependencies: six numpy scipy scikit-image (pip install -U scikit-image) OpenCV (i.e. c ...
- Win7中安装Windows PowerShell 3.0
win7内置的powershell是2.0,现在已经明显落伍了,但win系统软件更新,需要解决依赖问题,so,按下面步骤安装即可. 1. 安装Microsoft .NET Framework 4.0的 ...
- 使用vim-latex排版
前几天在某个群上看到了一篇简历,内容不重要,一看排版很漂亮的说.一问才知道是用latex排版工具排版的.一想到我都大三下学期的,也快大四了,是不是要准备一份简历.于是就想使用latex这个排版工具来排 ...
- angular学习笔记(二十)-表单验证
本篇主要介绍angular中的表单验证: 表单验证主要有以下一些内容: 1. required指令: 相当于html5的required属性,验证不能为空 2. ng-maxlength属性: 验证内 ...
- C++ 容器类 vector使用
vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的. 用法: 1.文件包含: ...
- sublime php插件
1. Package Control Get Package Control here. 2. Theme - Phoenix and Flatland(扁平) If Sublime Text ...
- Tomcat的URL中文乱码解决以及传输优化
默认的tomcat容器如果直接使用get方式在url中传中文时,传到后台接收会是乱码. 乱码问题 原因: tomcat默认的在url传输时是用iso8859-1编码. 解决方案一: 在使用get传输参 ...
- C#中模拟用户登陆SharePoint网站
自动化测试一个SharePoint网站,首先要登陆,我们今天就模拟一下用户登陆SharePoint网站的过程,这一过程可以通过其他方式完成模拟,比如通过Coded UI Test录制脚本会更方便,但是 ...