(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})
(32)forms组件(数据校验)的更多相关文章
- Django学习——分页器基本使用、分页器终极用法、forms组件之校验字段、forms组件之渲染标签、forms组件全局钩子,局部钩子
内容 1 分页器基本使用 2 分页器终极用法 3 forms组件之校验字段 1 前端 <!DOCTYPE html> <html lang="en"> &l ...
- Django forms组件的校验
引入: from django import forms 使用方法:定义规则,例: class UserForm(forms.Form): name=forms.CharField(max_lengt ...
- Django-多对多关系的三种创建方式-forms组件使用-cookie与session-08
目录 表模型类多对多关系的三种创建方式 django forms 组件 登录功能手写推理过程 整段代码可以放过来 forms 组件使用 forms 后端定义规则并校验结果 forms 前端渲染标签组件 ...
- Django框架(十四)-- forms组件、局部钩子、全局钩子
一.什么是forms组件 forms组件就是一个类,可以检测前端传来的数据,是否合法. 例如,前端传来的邮箱数据,判断邮件格式对不对,用户名中不能以什么开头,等等 二.forms组件的使用 1.使用语 ...
- Django框架(十五)—— forms组件、局部钩子、全局钩子
目录 forms组件.局部钩子.全局钩子 一.什么是forms组件 二.forms组件的使用 1.使用语法 2.组件的参数 3.注意点 三.渲染模板 四.渲染错误信息 五.局部钩子 1.什么是局部钩子 ...
- django基础之day09,Forms组件在程序中做了哪些事? 校验数据、渲染标签、展示信息
******************************* Forms组件 *************************************************** Forms组件在 ...
- Django day26 HyperlinkedIdentityField,序列化组件的数据校验以及功能的(全局,局部)钩子函数,序列化组件的反序列化和保存
一:HyperlinkedIdentityField(用的很少):传三个参数:第一个路由名字,用来反向解析,第二个参数是要反向解析的参数值,第三个参数:有名分组的名字 -1 publish = ser ...
- python 全栈开发,Day78(Django组件-forms组件)
一.Django组件-forms组件 forms组件 django中的Form组件有以下几个功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显 ...
- 03、 forms组件
1.校验字段功能 1.reg页面准备 models from django.db import models class UserInfo(models.Model): useranme = mode ...
- 基于forms组件和Ajax实现注册功能
一.基于forms组件的注册页面设计 1.运用forms组件的校验字段功能实现用户注册 views.py: (在钩子中代码解耦,将form放在cnblog/blog/Myforms.py中) f ...
随机推荐
- HTML5新技术FormData提交表单数据
免去了你每次都要document.getElement的方式去获取input的表单值 传统方式 新技术表单数据提交 FormData使用注意 .无需调用setRequestHeader()方法 .要求 ...
- 理解 Python 装饰器看这一篇就够了
讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切. 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,让它 ...
- 【Luogu P2664】树上游戏
Problem Description \(lrb\) 有一棵树,树的每个节点有个颜色.给一个长度为 \(n\) 的颜色序列,定义 \(s(i,j)\) 为 \(i\) 到 \(j\) 的颜色数量.以 ...
- 安装tifffile
python的opencv和PIL不能很好地处理tiff图像,所以我就转用tifffile 但是tifffile也装了很近,因为我是远控别人的电脑,所以看不太清报错,就自己瞎猜,不过还是装好了 首先去 ...
- 宇宙最帅叉叉——第三周博客 for 需求改进&原型设计
需求改进&原型设计 Ⅰ. 需求&原型改进 根据组内成员的讨论以及老师和同学的建议,本周进行了以下的改进: 添加注册功能 根据用户图形界面接收的用户账号及密码,客户端将接受内容记录在 ...
- linux远程管理常用命令
目标 关机/重启 shutdown 查看或配置网卡信息 ifconfig ping 远程登录和复制文件 ssh scp 01. 关机/重启 序号 命令 对应英文 作用 01 shutdown 选项 时 ...
- Linux应用调试 :使用gdb和gdbserver进行远程调试
一.引言 在日常程序开发中不免遇到类似空指针操作导致程序崩溃的问题,所以需要一定的手段去定位bug,而断点调试是普遍使用的技巧,比如Windows中用VC++的debug模式进单步运行.断点调试等,而 ...
- Java中主类中定义方法加static和不加static的区别
Java中主类中定义方法加static和不加static的区别(前者可以省略类名直接在主方法调用(类名.方法),后者必须先实例化后用实例调用) 知识点:1.Getter and Setter 的应用 ...
- Eclipse错误集合
一.Could not write metadata for '/RemoteSystemsTempFiles'. 错误代码 Could not write metadata for '/Remote ...
- 成功解决android studio打包报错
Win7系统,Android Studio 版本2.3.1,对cpp-empty-test使用了 cocos compile -p android --android-studio,命令 编译打包AP ...