Django_Form验证(一)
Django为我们提供了一个模板来做Form验证,不需要我们再去写复杂的验证代码了
简单的提交信息html页面:
<form action="/fff/Form" method="post">
<p><input type="text" name="ac" placeholder="用户名"><span>{{ infor.errors.ac.0 }}</span></p>
<p><input type="password" name="pwd" placeholder="密码"><span>{{ infor.errors.pwd.0 }}</span></p>
<p><input type="text" name="eMail" placeholder="邮箱"><span>{{ infor.errors.eMail.0 }}</span></p>
<p><input type="submit" value="Form提交"></p>
{% csrf_token %}
</form>
解决简单的提示验证问题:
from django import forms #导入包 #开始写模板
class Formsubmit(forms.Form):
ac=forms.CharField(min_length=6,error_messages={"required":"用户名不能为空","min_length":"长度不够"})
pwd=forms.CharField(max_length=10,error_messages={"required":"密码不能为空","max_length":"密码长度过长"})
eMail=forms.EmailField(error_messages={"required":"用户名长度不能为空","invalid":"邮箱格式不对"})
'''
注意:
1.字段的名字要和前段的字段相同,
2.第二个参数就是那种错误显示那种信息,
''' def Form(req):
if req.method=="GET":
return render(req,"Formsubmit.html")
elif req.method=="POST":
obj=Formsubmit(req.POST)#将得到req.POST信息传递给验证类做参数
status=obj.is_valid()#这里执行后才验证,验证的信息都存储在obj这个类中
if status:
rightData=obj.clean()#,去获取正确的信息,这里得到的是一个字典,就可以向数据库里面提交了
# models.xxx.create(**{rightData})
else:
errData=obj.errors#获取错误的信息,存储的是一个继承dict的类.
print(errData["ac"][0])#errDara是一个类,加上['ac']是一个list类,加上[0],就是取第一个错误信息,就是一个字符串了
return render(req,"Formsubmit.html",{"infor":obj})#将信息传递给前段代码
以上就能做到简单的验证.
问题来了:用户实际操作中,如果只有邮箱输入错误了,账号和密码都是正确的,但是一点提交,正确的信息被刷新,必须重新输入,
django当然也考虑到了,所以DjangoForm中还有其他功能.
首先我们自己考虑下,做到用户点提交,页面刷新后还有原来的信息,就必须在刷新后再在我们input框中加上上一次的值,但是我们的Input框自己写死了,所以要动态生成Input框
解决如下:
将html代码的input框动态起来:
<form action="/fff/Form" method="post">
<p>{{ infor.ac }}<span>{{ infor.errors.ac.0 }}</span></p>
<p>{{ infor.pwd }}<span>{{ infor.errors.pwd.0 }}</span></p>
<p>{{ infor.eMail }}<span>{{ infor.errors.eMail.0 }}</span></p>
<p><input type="submit" value="Form提交"></p>
{% csrf_token %}
</form>
后台代码中再GET请求的时候也创建Form对象,但是不传入参数,渲染给页面:
def Form(req):
if req.method=="GET":
obj=Formsubmit()
return render(req,"Formsubmit.html",{"infor":obj})
#其他都不需要修改
这样在执行的时候,就能达到想要的效果.
原因解释:
从动态生成input标签的结果来看,djangoForm对象其实就是为我们自动生成标签(标签有默认和指定的),然后获取值,再验证,再在标签中加入值.这就是他的功能.
流程:
第一次GET提交,Form对象没有拿到值,所以直接生成了空的input标签,--->输入值,POST提交--->Form对象拿到值---->提交后页面刷新,第二次GET请求的时候,Form对象已经拿到值,所以在渲染的时候input框中有上次提交的值.
由此可见前端页面上的Form对象必须都是一致的(列子中就是'infor')
formobj.has_changed()
查看提交的数据是否改变,这个是当我们在处理edit页面的时候比较适合用到,当页面内容没有改变的时候,就不做处理
formobj.changed_data
返回字段列表,查看那些字段改变了,修改起来也比较方便
def Form(req):
if req.method=="GET":
return render(req,"Formsubmit.html")
elif req.method=="POST":
data = {'ac': '', 'pwd': '', 'eMail': '1@1.com'}#c创建initial 作为对比数据 obj=Formsubmit(req.POST,initial=data)#将得到req.POST信息传递给验证类做参数
print('是否改变了;',obj.has_changed())
从form查看表单信息
>>> for row in f.fields.values(): print(row)
...
<django.forms.fields.CharField object at 0x7ffaac632510>
<django.forms.fields.URLField object at 0x7ffaac632f90>
<django.forms.fields.CharField object at 0x7ffaac3aa050>
>>> f.fields['name']
<django.forms.fields.CharField object at 0x7ffaac6324d0>
formobj.cleaned_data
返回'干净'的数据,并且只返回form中定义了的字段,如果是自己额外加的初始化字段,不会返回,并且只返回验证通过了的字段
比如:
>>> data = {'subject': '',
... 'message': 'Hi there',
... 'sender': 'invalid email address',
... 'cc_myself': True}
>>> f = ContactForm(data)
>>> f.is_valid()
False
>>> f.cleaned_data
{'cc_myself': True, 'message': 'Hi there'}#只返回了验证通过的字段
>>> data = {'subject': 'hello',
... 'message': 'Hi there',
... 'sender': 'foo@example.com',
... 'cc_myself': True,
... 'extra_field_1': 'foo',
... 'extra_field_2': 'bar',
... 'extra_field_3': 'baz'}
>>> f = ContactForm(data)
>>> f.is_valid()
True
>>> f.cleaned_data # 没有包含额外添加的字段
{'cc_myself': True, 'message': 'Hi there', 'sender': 'foo@example.com', 'subject': 'hello'}
form快捷显示:
直接打印
print(formobj)
print(formobj.as_p())
...就会看到区别,当然也可以单个字段打印
print(formobj['name'])
Django_Form验证(一)的更多相关文章
- Django_form验证
需求: 当用户向Django后端以post提交数据的时候,无论前端是否进行数据合法验证,后端都需要对客户端提交过来的数据进行数据合法性验证,是否可以利用models中表类字段的约束来实现验证,并且可以 ...
- Django_Form验证(三)字段,字段的参数,widgets种类
Form工具是一个很强大的工具,所以他的功能不仅仅是上面2个例子,这里详细记录一下Form的其他功能 字段的一般参数,以CharFields为列子: user=fields.CharField( re ...
- Django_Form验证(二),ajax验证
还是一个简单的html提交页面,ajax提交就不需要form表单了: <p><input id="a" type="text" name=&q ...
- Django之Form、ModelForm 组件
Django之Form.ModelForm 组件 一.Form组件: django框架提供了一个form类,来处理web开发中的表单相关事项.众所周知,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验证基础: ...
- DjangoForm 提交验证
用户提交数据的验证 1.创建模版 -- class LoginForm(forms.Form):.... 2.将请求交给模版,创建一个对象 -- obj = LoginForm(request.POS ...
- 【探索】无形验证码 —— PoW 算力验证
先来思考一个问题:如何写一个能消耗对方时间的程序? 消耗时间还不简单,休眠一下就可以了: Sleep(1000) 这确实消耗了时间,但并没有消耗 CPU.如果对方开了变速齿轮,这瞬间就能完成. 不过要 ...
- C# 中参数验证方式的演变
一般在写方法的时候,第一步就是进行参数验证,这也体现了编码者的细心和缜密,但是在很多时候这个过程很枯燥和乏味,比如在拿到一个API设计文档的时候,通常会规定类型参数是否允许为空,如果是字符可能有长度限 ...
- Yii1.1的验证规则
在Yii1.1的数据验证是由CValidator完成,在CValidator中提供了各种基本的验证规则 <?php public static $builtInValidators=array( ...
随机推荐
- PHP之缓存雪崩,及解决方法(转)
一.什么是缓存雪崩缓存雪崩就是指缓存由于某些原因(比如 宕机.cache服务挂了或者不响应)整体crash掉了,导致大量请求到达后端数据库,从而导致数据库崩溃,整个系统崩溃,发生灾难. 下面的就是一个 ...
- 由于找不到 opencv_world320.dll,无法继续执行代
首先找到自己软件安装(解压)的路径openCV (安装(解压)目录\opencv\build\x64\vc14\bin) 我的安装(解压)目录是:F:\OpenCV\Three320\opencv\b ...
- noip-2006普及组-数列- 【模拟-找规律-快速幂】
链接:https://ac.nowcoder.com/acm/contest/153/1047 来源:牛客网 题目描述 给定一个正整数k( ≤ k ≤ ),把所有k的方幂及所有有限个互不相等的k的方幂 ...
- 学习笔记TF021:预测编码、字符级语言建模、ArXiv摘要
序列标注(sequence labelling),输入序列每一帧预测一个类别.OCR(Optical Character Recognition 光学字符识别). MIT口语系统研究组Rob Kass ...
- wikipedia 维基百科 语料 获取 与 提取 处理 by python3.5
英文维基百科 https://dumps.wikimedia.org/enwiki/ 中文维基百科 https://dumps.wikimedia.org/zhwiki/ 全部语言的列表 https: ...
- machine learning data sets
http://archive.ics.uci.edu/ml/datasets.html 例如 3 分类 鸢尾花 数据集: http://archive.ics.uci.edu/ml/datasets/ ...
- 使用 jest 测试 react component 的配置,踩坑。
首先安装依赖 npm i jest -g npm i jest babel-jest identity-obj-proxy enzyme enzyme-adapter-react-15.4 react ...
- golang-grpc-Unimplemented-desc
golang 调用grpc 服务方法时候提示:"rpc error: code = Unimplemented desc ="的错误, 这是由于pb中的package name 被 ...
- SVN远程管理
1.使用远程桌面连接工具,分别填写连接地址和用户名进行连接 2.紧接着进行安全登录. 3.打开VisualSVN Server Manager工具进行显示已经拥有的项目和分配好的群组管理. 这样子就可 ...
- 京东返利渠道,自己拿返利,无需A推B操作
京东返利渠道,自己拿返利,无需A推B操作,简单快捷方便 1.在微信小程序中搜索 “京东饭粒” 2.进入京东饭粒,进购物车下单(只能在购物车内下单返利) 3.收货后26天返京豆到你的京东账号中,”佛系返 ...