django做form表单的数据验证
我们之前写的代码都没有对前端input框输入的数据做验证,我们今天来看下,如果做form表单的数据的验证
在views文件做验证
首先用文字描述一下流程
1、在views文件中导入forms模块
2、然后创建一个类,继承forms.form
3、然后在这个类中写变量,这个变量的就是input标签中的name,也就是前端往后端传递的k值,我们就可以对这个k值对应的v值做数据内容的校验,比如是邮箱模式,比如是否允许空,最大字段长度,最小字段长度
4、然后在视图函数中,实例化一个步骤3中的类,然后用这个对象去接受request.post中的值,然后对象就会根据post方式传递来的k值和类中的k对应,然后比较post传递过来的v值是否符合规范
5、
1、先导入forms模块
from django import forms
2、创建模板的类
# 1、创建模板
class loginform(forms.Form):
# 2、模板中的元素
name = forms.CharField(min_length=6,error_messages={"requird":"用户名不能为空","min_length":"最小长度为6"})
# requird这个是错误码 email = forms.EmailField()
这里这个error_messages写出错的信息,每个不同的错误码对应不同的报错信息
3、在视图函数中使用这个类
def login(request):
if request.method.lower() == "post":
# 3、创建一个模板的对象,然后把数据传递个这个对象
obj = loginform(request.POST) # 4、启动校验 status= obj.is_valid()
print(status) # 5、正确的信息
success_dict = obj.clean()
print(success_dict) # 6、错误的信息
failed_dict = obj.errors.as_json()
print(failed_dict)
return redirect("/app1/login")
else:
return render(request,"login.html")
这里就会校验前台发来的数据中,k为name和email的值的合法性
因为是form表单,所以提交后页面会刷新,上次输入的数据就没有了,我们可以通过下面的方式实现保留上次输入的值
前端代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>form提交测试</h1>
<form method="post" action="/app1/login/">
<p>
{# <input type="text" name="name" placeholder="用户名">#}
{# 这段html要django帮我们生成#} {{ xx.name }}
<span>{{ xx.error.name.0 }}</span>
</p>
<p>
{# <input type="text" name="email" placeholder="邮箱">#}
{# 这段html要django帮我们生成#} {{ xx.email }}
<span>{{ xx.error.email.0 }}</span>
</p>
<p>
<input type="text" name="pwd" placeholder="密码">
</p>
<input type="submit" value="submit提交">
<input type="button" value="ajax提交" id="ajax_test1">
</form>
<script src="/static/jq/jquery-3.3.1.js"></script>
<script>
$(function () { }) $("#ajax_test1").bind("click",function () {
$.ajax({
url:"/app1/login/",
type:"POST",
data:{
name:"cui",
email:"cui@126.com",
pwd:"admin123."
}
}
)
})
</script>
</body>
</html>
后端代码
from django.shortcuts import render
from django.shortcuts import HttpResponse
from django.shortcuts import redirect
# Create your views here. from django import forms """
def login(request):
if request.method.lower() == "post":
print(request.POST.get("name"))
return redirect("/app1/login")
else:
return render(request,"login.html")
# return redirect("/app1/login")
# return HttpResponse("hahh")
""" # 1、创建模板
class loginform(forms.Form):
# 2、模板中的元素
name = forms.CharField(min_length=6,error_messages={"required":"用户名不能为空","min_length":"最小长度为6666666666"})
# requird这个是错误码 email = forms.EmailField(error_messages={"required":"邮箱不能为空","invalid":"邮箱格式错误"}) def login(request):
if request.method.lower() == "post":
# 3、创建一个模板的对象,然后把数据传递个这个对象
obj = loginform(request.POST) # 4、启动校验 status= obj.is_valid()
print(status) # 5、正确的信息
success_dict = obj.clean()
print("正确的信息----------->",success_dict) # 6_1、错误的信息1
# failed_dict = obj.errors.as_json() # 6_2、错误的信息1
failed_dict = obj.errors if not obj.is_valid():
# print(failed_dict["name"])
# print(failed_dict["name"][0])
print("错误的信息----------->",failed_dict)
print("名称的错误信息-------->",failed_dict["name"][0])
print("邮箱的错误信息-------->", failed_dict["email"][0])
return render(request, "login.html", {'xx': obj})
# return redirect("/app1/login")
else:
obj = loginform()
# return render(request,"login.html")
# return redirect("/app1/login")
return render(request,"login.html",{"xx":obj})
# return HttpResponse("hahh")
主要是要看这里


#Auther Bob
#--*--conding:utf-8 --*-- from django import forms
from django.forms import widgets class DeatilForm(forms.Form):
# pwd = forms.CharField(widget=widgets.PasswordInput())
# user = forms.CharField(widget=widgets.TextInput())
pwd = forms.CharField(widget=widgets.PasswordInput(attrs={"class":"c1","placeholder":"密码"}))
user = forms.CharField(widget=widgets.TextInput(attrs={"class":"c2","placeholder":"用户名"})) age = forms.IntegerField()
# 这里的效果是输入框只能输入数字,其他的都无法输入 choice1 = forms.ChoiceField(choices=[(1,"内蒙古"),(2,"广东"),(3,"黑龙江")]) choice2 = forms.CharField(
widget=widgets.Select(choices=[(1,"内蒙古"),(2,"广东"),(3,"黑龙江")])
)
choice3 = forms.IntegerField(
widget=widgets.Select(choices=[(1,"内蒙古"),(2,"广东"),(3,"黑龙江")])
)
choice4 = forms.IntegerField(
widget=widgets.RadioSelect(choices=[(1,"内蒙古"),(2,"广东"),(3,"黑龙江")])
) # 进行一下字段学习
class FiledForm(forms.Form):
arg1 = forms.CharField( # 这个属性是charfiled特有的
# max_length=233,最大的字符长度
# min_length=234,最小的字符长度 # 下面这些属性是filed都有的,下面参数都可以用下面的参数 # required=True 是否必填
# label=None 就是显示一个字符串,在前台渲染的时候用obj.arg1.label就会显示label的值,只是一个锦上添花的作用
# initial=None 这里就是一个默认值,也就是初始值
# help_text=''这里就是一个帮助信息 # error_messages=None 出错的时候显示的信息 # show_hidden_initial=False 是否生成带有默认值的一个隐藏的标签,可以用来判断现在的输入值和默认值是否相同 # validators=() 自定义一个正则表达式 # localize=False 是否支持本地化,暂时不需要掌握 # disabled=False 标签是否能否能编辑 # label_suffix=None 默认这个值就是冒号,也就是前面label的值和input框之间的冒号,如果设置了这个值,就会替代lable和input框中之间的冒号 # error_messages=None
# error_messages={"required":"不能为空","invalid":"格式错误",} )
arg2 = forms.IntegerField(
# max_value=23, 最大值
# min_value=21. 最小值
) arg3 = forms.FloatField( ) arg4 = forms.DateField(
# 页面必须要满足这个格式,格式是:2015-09-03
) arg5 = forms.TimeField(
# 页面必须要满足这个格式,格式是:11:34
) arg6 = forms.DateTimeField(
# 页面必须要满足这个格式,格式是:2015-09-03 11:34
) arg7 = forms.EmailField( ) arg8 = forms.PasswordInput( ) arg9 = forms.RegexField(
# 通过正则表达式自定义字段
) arg10 = forms.FileField( ) arg11 = forms.ImageField( ) # 单选框
arg12 = forms.ChoiceField(
initial=2,
choices=((1,"内蒙古"),(2,"黑龙江"),(3,"广东"))
) # 多选框
arg13 = forms.MultipleChoiceField(
initial=[1,2],
choices=((1,"内蒙古"),(2,"黑龙江"),(3,"广东"))
) arg14 = forms.FilePathField(
# recursive=False 是否递归显示,是否显示文件下的文件 # 指定一个路径,会把这个路径下所有的文件和路径用select框显示出来
) arg15 = forms.GenericIPAddressField(
# 解析ip地址
)
arg16 = forms.SlugField(
# 只允许输入,字母数字和下划线减号
) arg17 = forms.UUIDField(
# 只支持uuid格式的输入
)
# 这里的arg*就是k值
f8 = fields.ChoiceField(
choices=[(1, "上海3"), (2, "北京3"), (3, "深圳3")],
initial=3,
required=True,
label="城市",
label_suffix="------>"
) f9 = fields.TypedChoiceField(
choices=[(1, "上海4"), (2, "北京4"), (3, "深圳4")],
initial=3,
required=True,
coerce=lambda x:int(x)
) f10 = fields.MultipleChoiceField(
choices=[(1, "上海5"), (2, "北京5"), (3, "深圳5")],
initial=[1,3,]
) f11 = fields.TypedMultipleChoiceField(
choices=[(1, "上海5"), (2, "北京5"), (3, "深圳5")],
initial=[1, 3, ],
coerce=lambda x:int(x),
) f12 = fields.FilePathField(path="app1",allow_folders=True,recursive=False,allow_files=) # recursive:递归显示,true不显示,false显示
# allow_folders:是否显示文件夹
# allow_files:是否显示文件 f13 = fields.GenericIPAddressField(
protocol="both"
) f13 = fields.SlugField()
# 只允许数字,字母,下划线,减号
widget可以指定插件的类型

django做form表单的数据验证的更多相关文章
- Django之form表单提交并验证
1.提交的时候会报错 2. 需要在setting里面注释掉一句话,关闭跨站请求检查. 3. 注释掉以后,理论上就不报错了.可我还是卡壳了. 4. 通过在网上找方法,修复错误. 原因:表单action字 ...
- 转载:Django之form表单
转载: 一.使用form类创建一个表单 先定义好一个RegForm类: forms.py from django import forms # 导入forms类 class NameForm(form ...
- Django的form表单
html的form表单 django中,前端如果要提交一些数据到views里面去,需要用到 html里面的form表单. 例如: # form2/urls.py from django.contrib ...
- javascprit form表单提交前验证以及ajax返回json
1.今天要做一个手机验证码验证的功能.需求是前端页面点击发送 短信验证码,后台接收后通过ajax返回到前端,之后前端在提交时候进行验证.思路很简单,不过做的过程还是学到不少的东西. 1.ajax请求后 ...
- Django 11 form表单(状态保持session、form表单及注册实现)
Django 11 form表单(状态保持session.form表单及注册实现) 一.状态保持 session 状态保持 #1.http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状 ...
- thinkPHP5.0使用form表单提交数据和删除文章,不用TP的提示页面,使用弹出提示信息
form表单提交数据和删除文章时,TP的默认信息提示页面的看起来不是很好看,想要实现弹窗提示怎么做呢? 前端:可以使用前端的一个知识--iframe,iframe元素会创建包含另外一个文档的内联框架: ...
- Django--分页器(paginator)、Django的用户认证、Django的FORM表单
分页器(paginator) >>> from django.core.paginator import Paginator >>> objects = ['joh ...
- form表单的ajax验证2
form表单的ajax验证2: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...
- js模拟form表单提交数据, js模拟a标签点击跳转,避开使用window.open引起来的浏览器阻止问题
js模拟form表单提交数据, js模拟a标签点击跳转,避开使用window.open引起来的浏览器阻止问题 js模拟form表单提交数据源码: /** * js模拟form表单提交 * @param ...
随机推荐
- maven package 命令报:-source1.3 中不支持注释错误
在使用maven 打包或者编译时报:-source1.3 中不支持注释错误解决方案如下: <build> <plugins> <plugin> < ...
- linux下一个监测进程CPU和MEM使用率的shell脚本
#!/bin/bashPID=$1 cpu=`ps --no-heading --pid=$PID -o pcpu`mem=`ps --no-heading --pid=$PID -o pmem`ec ...
- SparkStreaming 运行原理与核心概念
SparkStreaming 运行原理 sparkstreaming 的高层抽象DStream Dstream与RDD的关系 Batch duration
- ioi2016aliens
/* 首先考虑点在直线的两边效果一样 于是转移到一边 之后发现当我们覆盖某些点时,有其他的一些点一定会被覆盖 我们找出所有必须覆盖的点 之后我们发现我们找到的这些点 将其按照x递增排序 那么y也是递增 ...
- express 3.5 Err: request aborted
在处理app传过来的图片时遇到的,顾名思义,就是请求中断,图片在传输过程中遇到了网络不良问题,express 3.5 的中间件 bodyParser会在我们操作这些图片之前接收它们,接收过程中传输中断 ...
- 外观设计模式 (Facade)
目的:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使 外观设计模式使用场合: 1. 在设计初期阶段,应该有意识的将不同的两个分层.层与层之间建立外观 ...
- C++官方文档-运算符重载
#include <iostream> using namespace std; class CVector { public: int x, y; CVector() : x(), y( ...
- springboot ssl http转Https
参考:https://www.cnblogs.com/imfjj/p/9058443.html (里面有坑) https://blog.csdn.net/l4642247/article/deta ...
- spring data jpa @query的用法
@Query注解的用法(Spring Data JPA) 参考文章:http://www.tuicool.com/articles/jQJBNv . 一个使用@Query注解的简单例子 @Query( ...
- 万字总结:学习MySQL优化原理,这一篇就够了!
前言 说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的 ...