博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
django Form组件的应用
阅读量:2268 次
发布时间:2019-05-09

本文共 6419 字,大约阅读时间需要 21 分钟。

一、在此之前所用的提交数据里面,要么用form表单提交数据,要么使用AJAX提交数据(传值到后端,提交后值依然保存在input框中)。

form表单提交数据 缺点:

1、不能保留上次提交的数据,如果是刷新页面数据依然不会保留。

     解决:使用django自带的 Form 组件,对form表单的验证:

    ∆∆∆Form组件的作用:

      1】用户请求数据校验(本质就是正则表达式验证)

      2】保留上次输入的内容,生成HTML标签

    ∆ form表单的缺点,可以使用django  的 Form 组件:  

          Form组件的使用:

1、定义一个类Form,这个类继承Form:class LoginForm(Form):    字段名=fields.Charfield(max_length=32)#本质就是正则表达式验证2、实例化一个对象obj=LoginForm(request.POST)# request.POST  用户从前端传过来的数据3、判断用户是否在input框中输入值 用 obj.cleaned_data()  #cleaned_data  是正确的信息4、obj.errors() .  这个是用户没输入或者输入的信息没有与Form组件的正则匹配,errors()会返回错误信息到 前端,错误信息如果要在前端展示则需如: 

{

{ obj.errors.user.0 }}

django Form组件使用--代码示例(案例1):

(Form组件与ajax保存上次提交的信息)

views.py 

#定义Form组件,class LoginForm(Form):    username=fields.CharField(required=True,max_length=48)#这个字段要与前端的input的 name属性一致,不然这个里的fields.CharField(这里的正则表达匹配不到)    password=fields.CharField(required=True)def login(request):    ret={
'status':True,'msg':None) if request.method=='GET': return render(request,'login.html') else: obj=LoginForm(request.POST) if obj.is_valid(): #is_valid()内部原理:          1、获取当前类中所有的字段,当对LoginForm实例化的时候,会把username\password放到self.fields中(也就是说会找到LoginForm中的所有的字段),而里面的字段,包含的就是一个正则表达式          2、is_valid() 里面会循环self.fields,现在里面有usernamae,password两个字段, 也就是说里面的字段数有两个,里面有几个字段是我们来定的          3、is_valid() 里面的结构如:            flag=true            erros=        cleaned_data=            for k,v in self.fields.items():              k就是:usernane, password              v就是: 正则表达式fields.CharField()            input_value=request.POST.get(k)#这是用户提交过来的数据              v正则表达式与input_value做校验,如果成功--则通过,返回一个正确信息 cleaned_data,否则就返回一个错误信息(errors,)              flag=False# 但凡有一个错误,就返回给用户一个False print(obj.cleaned_data) return redirect('http://www.baidu.com') else: print(obj.errors) ret['status']=False ret['msg']=obj.errors v=json.dumps(ret) print(v) return HttpResponse(v) return render('.........')#将正确的信息和错误的信息返回到前端 login.html
{
% csrf_token %} username:
{
{ obj.errors.username.0 }} password:
{
{ obj.errors.username.0 }}
提交

效果截图

 

总结:

1、在以后的使用中:

      1】ajax: 仅用于验证功能 .    ∆∆∆∆∆∆

      2】Form组件:用在验证功能,和生成HTML标签 .   ∆∆∆∆∆∆

2、django Form组件中的关键字 

例:

class CommentForm(Form):

      name=fields.CharField(这里面的关键字)

∆ initial ='you name '#input框中的默认值 ,fields.DateField(initial=datetime.date.today,),∆ auto_id =False  #是否自增∆ label = 'your name '   #label='Username: ' :就是input标签前面的文字,  ∆∆ widge:  与widgets配合使用,指定生成一个radio 标签例如:性别选择 :Choice=(('1','male'),('2','famale'))gender=fields.ChoiceField(widge=widgets.RadioSelect,choices=Choice) ∆ CharField() #字符串 ∆ IntergerField # 数字 ∆ EmailField #限制只能输入邮箱格式: Example: fields.EmailField ∆ URLField() #只能输入URL类型的字段 ∆ SlugField() #字母、数字、下划线 ∆ GenericIPAddressField() # iP 地址类型输入 ∆ DateTimeField #时间类型输入 ∆ RegexField('138\d+') ##自定制格式 ,可以设置,最长、最短、是否为空、 ˚˚˚˚上述字段的本质就是正则表达式,如果这些规则不够,就用自己写的正则表达式˚˚¬˚˚˚˚˚

优化 简写案例一,前端标签都则django Form组件生成 :views.py 文件 :

from django.forms import Form,fields,widgets,formsimport datetime,timeimport jsonclass LoginForm(Form):    username=fields.CharField(required=True,max_length=48,     label='Username: ')    password=fields.CharField(required=True)    Choice=(('1','famale'),('2','male'))    gender=fields.ChoiceField(widget=widgets.RadioSelect,choices=Choice)    date=fields.DateField(initial=datetime.date.today)def login(request):    ret={
'status':True,'msg':None} if request.method=='GET': obj=LoginForm()#保存这个input框的值,前端必须写{
{ obj.username }} {
{ obj.errors.username.0 }} return render(request,'login.html',{
'obj':obj})#obj---> 它的内部就是给前端生成 一个input框 ,内部中有个__str__: 如果没有传任何值的话,就是一个空的input框 else: print(obj.errors) ret['status']=False ret['msg']=obj.errors v=json.dumps(ret)# 现在这里有值了,这个有值的input框,就多了个value,     print(obj.cleaned_data)#用户提交过来的值 cleaned_data 前端的input 的value就多了个value={
{ obj.username }} ,cleaned_data :表示前端输入了正确的值 return HttpResponse(v) return render(request,'login.html',{
'obj':obj,'v':v})∆标签不手写,全由后端控制:
{
% csrf_token %} {
{ obj.date }}

{

{ obj.gender }}

{

{ obj.username.label }} {
{ obj.username }} {
{ obj.errors.username.0 }}

{

{ obj.password }} {
{ obj.errors.password.0 }}

提交

 再来一例:

注册表单:

自定义验证规则:

views.py

class RegisterForm(Form):    user=fields.charField(max_length=43)    email=fields.EmailField()    password=fields.CharField()    phone=fields.RegexField('139\d+')def register(request):    if request.method=='GET':        obj=RegisterForm()        return    render(request,'register.html',{
'obj':obj}) else: obj=RegisterForm(request.POST) if obj.is_valid(): print(obj.cleaned_data) else: print(obj.errors) return render(request,'register.html',{
'obj':obj})register.html
{
% csrf_token %}

{

{ obj.user }} {
{ obj.errors.user.0 }}

{

{ obj.password }}{
{ obj.errors.password.0 }}

{

{ obj.phone }}{
{ obj.errors.phone.0 }}

 Form表单中自定义错误信息:

#自定义错误信息class TestForm(Form):    t1=fields.CharField(required=True,max_length=8,min_length=2,                        label='www.baidu.com',#前端obj.label_t1 访问                        initial='321',#初始值                        help_text='22',                #自定义错误信息                        error_messages={                            'required':'不能为空',                            'max_length':'too long',                            'min_length':'to short',                        })    t2=fields.IntegerField(        max_value=10000,        min_value=10,        error_messages={            'required':'t2不能为空',            'invalid':'T2格式错误,必须是数字',            'max_value':'大于10000',            'min_value':'小于10',        },    ) #Interger 是默认是 required True#邮箱格式继承CharField    t3=fields.EmailField(        error_messages={            'required':'不能为空',            'invalid':'t3格式错误,必须是邮箱格式',        },        disabled=True,#是否可以 编辑        label_suffix=''    )

 

利用Form 组件做的增、删、改、查(学生表与教师表)

http://pan.baidu.com/s/1sl6V31j   # year2017/mon7/day/s4day772下

 

 

 

 

 

 

 

   

 

    

    

转载于:https://www.cnblogs.com/tonycloud/articles/7137359.html

你可能感兴趣的文章
JAVA 对象访问: 句柄和指针
查看>>
秒杀系统优化思路
查看>>
dubbo 报错:java.lang.NoClassDefFoundError: org/I0Itec/zkclient/exception/ZkNoNodeException
查看>>
logback的使用和logback.xml详解
查看>>
Linux 快捷键
查看>>
JPA 联合主键配置
查看>>
ObjectAlreadyExistsException:Unable to store Job : '*', because one already exists with thi s ident
查看>>
mybatis & JPA 实体类型属性转换
查看>>
Git 中的 ~ 和 ^
查看>>
第一篇博客,给大家分享java、架构师、大数据、人工智能的学习路线,希望能够帮助到大家
查看>>
18级大数据专家,跟大家漫谈大数据平台架构,你能学到多少?上篇
查看>>
18级大数据专家,漫谈大数据平台安全风险与建设,值得学(下篇)
查看>>
阿里P8终于整理出:Nginx+jvm+MySQL+Docker+Spring实战技术文档
查看>>
腾讯T4专家精心整理:大数据+机器学习+数据挖掘+算法大集结
查看>>
阿里P8终于总结出:SpringBoot+Tomcat+Nginx+Netty面试题及答案
查看>>
阿里P7大牛,深入剖析JVM底层设计原理+高级特性pdf,附46页ppt
查看>>
史上最全141道大数据面试题:Redis+Linux+kafka+Hadoop,附答案
查看>>
一文带你深入理解JVM,看完之后你还敢说你懂JVM吗?颠覆you认知
查看>>
这些大厂面试真题你能答出来,年薪至少30-50W,想不想挑战一下?
查看>>
携程T7用637页PDF,解读十余热门技术领域,八场携程技术沙龙干货
查看>>