django做form表单的数据验证过程详解
作者:bainianminguo 发布时间:2023-11-10 12:26:13
标签: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值是否符合规范
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可以指定插件的类型
来源:https://www.cnblogs.com/bainianminguo/p/8983093.html
0
投稿
猜你喜欢
- PHP 备份 mysql 数据库的源代码,在完善的 PHP+Mysql 项目中,在后台都会有备份 Mysql 数据库的功能,有了这个功能,对
- 第一个版本在这个版本中,首先创建了 RouterConfig 对象,其构造方法创建了 tornado.web.Application() 并
- Python爬虫:一些常用的爬虫技巧总结爬虫在开发过程中也有很多复用的过程,这里总结一下,以后也能省些事情。1、基本抓取网页get方法imp
- 使用MySQL,安全问题不能不注意。以下是MySQL提示的23个注意事项:1.如果客户端和服务器端的连接需要跨越并通过不可信任的网络,那么就
- 距上篇关于淘宝抢购源码的文章已经过去五个月了,五个月来我通过不停的学习,掌握了更深层的抢购技术及原理,而上篇文章中我仅分享了关于加入购物车的
- 最近遇到一个问题,就是获取表单中的日期往后台通过json方式传的时候,遇到Date.parse(str)函数在ff下报错: NAN 找了些资
- 摘要: 本文由简到繁地介绍了以jQuery作为蓝本的js框架开发步聚, 希望借助本文大家对jQuery这样的框架内部有一个大致的认识。推荐:
- redis相信大家都很熟悉了,和memcached一样是一个高性能的key-value数据库,至于什么是缓存服务器,度娘都有很明白的介绍了,
- Memento备忘录模式 备忘录模式一个最好想象的例子:undo! 它对对象的一个状态进行了'快照', 在你需要的时候恢复原
- 目录简单的验证码简单的登录页面我们经常在登录一个网站,或者注册的时候需要输入一个验证码,有时候觉得很烦,因为有些验证码不仅复杂还看不清,许多
- 如果你忘记了你的MYSQL的root口令的话,你可以通过下面的过程恢复。1. 向mysqld server 发
- 通过学习ASP明明白白你的If语句流程。If condition Then [statements1]E
- 由于工作的需求,需要用python做一个类似网络爬虫的采集器。虽然Python的urllib模块提供更加方便简洁操作,但是涉及到一些底层的需
- 执行环境会负责管理代码执行过程中使用的内存,编写JavaScript程序时,所需内存的分配以及无用内存的回收完全实现自动管理。原理:找出那些
- 本文实例讲述了php基于curl主动推送最新内容给百度收录的方法。分享给大家供大家参考,具体如下:php curl的好处可以以最快的方式并且
- 如何动态添加单元格!! 用insertRow()和insertCell()方法 其用法如下: insertRow() v
- 1、引言小丝:鱼哥, 请教你个问题。小鱼:你觉得你得问题,是正儿八经的吗?小丝:那必须的, 人都正经,何况问题呢?小鱼:那可不敢说, 你得问
- QZONE平台的相册功能为保证加载速度一直以来以简洁的图片排列查看模式呈现相片,随着市场上各类相册产品推陈出新,用户越来越强烈的要求个人相册
- python正则表达式括号python中re库函数的简单用法re.findall(pattern,string)匹配所有符合正则表达式的字符
- 和大多数的语言脚本一样,学习ASP最好的方法就是亲身尝试ASP,使用你自己的系统安装PWS或者IIS。你可以边学习边在你自己的服务器上测试A