Python Web框架之Django框架Form组件用法详解
本文实例讲述了PythonWeb框架之Django框架Form组件用法。分享给大家供大家参考,具体如下:
Form简介
在HTTP中,表单(form标签),是用来提交数据的,其action属性说明了其传输数据的方法:如何传、如何接收。
访问网站时,表单可以实现客户端与服务器之间的通信。例如查询,就用到了表单(其属性中,action=get)。
再比如说注册与登陆,也是要用到表单的。但这里由于涉及到隐私问题,需要保证数据传输的安全性,因此其传输方法就应当使用post而非get。
总之,对客户端来说,表单就是用来向服务器提交数据的;
而对服务器来说,表单就是你提供给客户端的发送信息的渠道,你需要对用户发送来的信息进行处理和响应,以达到页面的交互。
DjangoForm的功能
- 生成HTML标签
- 验证用户数据(显示错误信息)
- HTMLForm提交保留上次提交数据
- 初始化页面显示内容
DjangoForm验证流程
用于验证用户请求数据合法性的一个组件
如果没有Form就得繁琐地用正则表达式了
a.用户提交数据的验证
1、创建模版classLoginForm(forms.Form):...
2、将请求交给模版,创建一个对象obj=LoginForm(request.POST)
3、进行验证obj.is_valid()
4、获取正确信息obj.clean()
5、获取错误信息obj.errors
b.错误信息提示
Form提交,刷新页面的特性,模版对象内部值丰富,再显示时,值和错误信息都有
c.保留上一次提交的数据
1、自动生成html标签
2、保留上一次提交的数据
Form的创建
fromdjango.shortcutsimportrender,redirect fromdjangoimportforms #这里为了简单,把form类写到视图函数 #模版 classLoginForm(forms.Form): #模版中的元素 user=forms.CharField(min_length=6,error_messages={"required":'用户名不能为空','min_length':'用户名长度不能小6'}) email=forms.EmailField(error_messages={"required":'邮箱不能为空','invalid':'邮箱格式错误'}) deflogin(request): ifrequest.method=="GET": #数据库中获取 obj=LoginForm() returnrender(request,'login.html',{'oo':obj}) elifrequest.method=="POST": """ obj=LoginForm(request.POST) #验证 status=obj.is_valid() print(status) value_dict=obj.clean()验证成功的值,输入格式正确的拿到了 print(value_dict) #error_obj=obj.errors error_obj=obj.errors.as_json() print(error_obj)code定义错误信息 """ obj=LoginForm(request.POST) ifobj.is_valid(): value_dict=obj.clean() print(value_dict) #create(**value_dict) else: #封装了所有的错误信息 #error_obj=obj.errors #print(obj.errors['email'][0],type(error_obj['email']) #print(obj.errors['email'][0],type(error_obj['email'][0]) #print(obj.errors["user"][0]) #print(type(error_obj)) fromdjango.forms.utilsimportErrorDict pass returnrender(request,'login.html',{'oo':obj})
当然你也可以在app里创建form.py文件,在里面创建类:
下文将使用这个文件。
fromdjangoimportformsasDForms fromdjango.formsimportfields fromdjango.formsimportwidgets fromdjango.core.validatorsimportRegexValidator classDetailForm(DForms.Form): user1=fields.CharField()#默认input框,可以改成select,radio等 user2=fields.CharField(widget=widgets.TextInput) user4=fields.IntegerField() #字符串 user3=fields.ChoiceField(choices=[(1,'SH'),(2,'BJ'),]) user5=fields.CharField( widget=widgets.Select(choices=[(1,'SH'),(2,'BJ'),]) ) user6=fields.IntegerField( widget=widgets.Select(choices=[(1,'SH'),(2,'BJ'),]) ) user7=fields.IntegerField( widget=widgets.RadioSelect(choices=[(1,'SH'),(2,'BJ'),]) ) #{'user1':'11','user2':'22','user4':33,'user3':'1','user5':'2','user6':1,'user7':2}
视图函数:
fromdjango.shortcutsimportrender,redirect fromapp01importforms defdetail(request): obj=forms.DetailForm(request.POST) obj.is_valid() print(obj.clean()) returnrender(request,'detail.html',{'obj':obj})
生成HTML:
Title {{obj.user1}} {{obj.user2}} {{obj.user3}} {{obj.user4}} {{obj.user5}} {{obj.user6}} {{obj.user7}}