圆月山庄资源网 Design By www.vgjia.com
我们之前写的代码都没有对前端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="/UploadFiles/2021-04-08/jquery-3.3.1.js">后端代码
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可以指定插件的类型
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
圆月山庄资源网 Design By www.vgjia.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
圆月山庄资源网 Design By www.vgjia.com
暂无评论...
更新日志
2024年11月08日
2024年11月08日
- 雨林唱片《赏》新曲+精选集SACD版[ISO][2.3G]
- 罗大佑与OK男女合唱团.1995-再会吧!素兰【音乐工厂】【WAV+CUE】
- 草蜢.1993-宝贝对不起(国)【宝丽金】【WAV+CUE】
- 杨培安.2009-抒·情(EP)【擎天娱乐】【WAV+CUE】
- 周慧敏《EndlessDream》[WAV+CUE]
- 彭芳《纯色角3》2007[WAV+CUE]
- 江志丰2008-今生为你[豪记][WAV+CUE]
- 罗大佑1994《恋曲2000》音乐工厂[WAV+CUE][1G]
- 群星《一首歌一个故事》赵英俊某些作品重唱企划[FLAC分轨][1G]
- 群星《网易云英文歌曲播放量TOP100》[MP3][1G]
- 方大同.2024-梦想家TheDreamer【赋音乐】【FLAC分轨】
- 李慧珍.2007-爱死了【华谊兄弟】【WAV+CUE】
- 王大文.2019-国际太空站【环球】【FLAC分轨】
- 群星《2022超好听的十倍音质网络歌曲(163)》U盘音乐[WAV分轨][1.1G]
- 童丽《啼笑姻缘》头版限量编号24K金碟[低速原抓WAV+CUE][1.1G]