当前位置:主页 > 查看内容

一篇文章浅析Django Form组件相关知识

发布时间:2021-07-19 00:00| 位朋友查看

简介:前言 在上一篇时,我们小试牛刀了以下Django Form组件的使用,一篇文章带你了解Django Form组件(入门篇),没来得及的小伙伴可以一起看看。但是你可能会有很多疑问,并不知道怎么使用。 并且知道Form组件的功能。 生成HTML标签。 验证提交的数据。 保留提交之……

前言

在上一篇时,我们小试牛刀了以下Django Form组件的使用,一篇文章带你了解Django Form组件(入门篇),没来得及的小伙伴可以一起看看。但是你可能会有很多疑问,并不知道怎么使用。

并且知道Form组件的功能。

  • 生成HTML标签。
  • 验证提交的数据。
  • 保留提交之前的数据。

所以本篇就接着上次的继续,来一起学习以下Django Form组件如何使用。

Form组件的理解

没有使用Form组件时

在一般情况下,我们如果编写输入框时,在Html中,一般都是这样写的。

代码

  1. ... 
  2. <form method="post" action="" novalidate> 
  3.     <div> 
  4.         <label>用户名:</label> 
  5.         <input type="text" name="uname"
  6.     </div> 
  7.     <div> 
  8.         <label>密码:</label> 
  9.         <input type="text" name="upwd"
  10.     </div> 
  11.     <div><input type="submit"></div> 
  12. </form> 
  13. ... 

实现效果


使用Form组件时

在使用Form组件时,我们通常需要定义Form类。

这个Form,里面的字段,就可以理解为input标签,只不过是在后端写的。

Form类

  1. from django.forms import Form 
  2. class LoginForm(Form): 
  3.     uname = fields.CharField(label="用户名"
  4.     upwd = fields.CharField(label="密码"

views.py

  1. from django.shortcuts import render 
  2. def login(request): 
  3.     form = LoginForm() 
  4.     return render(request, "login_f.html", {"form": form}) 

html

  1. ... 
  2. <form method="post" action="" novalidate> 
  3.     <div> 
  4.         <label>{{ form.uname.label }}:</label> 
  5.         {{ form.uname }} 
  6.         <!--  
  7.             form.uname.errors.0 是为了展示填写不正确的错误信息 
  8.             errors.0是因为错误可能有多个 
  9.             但是通常情况下,取第一个错误足够 
  10.          --> 
  11.         {{ form.uname.errors.0 }} 
  12.     </div> 
  13.     <div> 
  14.         <label>{{ form.upwd.label }}:</label> 
  15.         {{ form.upwd }} 
  16.         {{ form.upwd.errors.0 }} 
  17.     </div> 
  18.     <div><input type="submit"></div> 
  19. </form> 
  20. ... 

小总结

可以发现,我并没有写input代码,而是直接调用后端的form.<字段名>出来的。

Form类生成的Html


可以发现,基本上和自己写的Html差不多,生成的id为id+<字段名>。

Form生成的Html和手动写Html对应图


通过对应图确定,通过后端的form.<字段>生成的直接就是input标签。

好了,到这,就确定了Form类,就是为我们生成input标签的。

Form使用

使用有以下步骤。

1.创建Form类,尽可能和models对上。

  1. class LoginForm(Form): 
  2.     uname = fields.CharField(label="用户名"
  3.     upwd = fields.CharField(label="密码"

因为Form提交的数据,可以转换成dict,key就是Form字段名。

如果Form字段和models对上,直接models.<模型类>.objects.create(**dict)。

2.如果是GET请求,实例化Form对象,并且返回页面。

  1. def login(request): 
  2.     if request.method == 'GET'
  3.         form = LoginForm() 
  4.         return render(request, "login_f.html", {"form": form}) 

3.如果是POST请求,实例化Form对象时,传入request.POST,request.FILES,并且验证。

  1. # 接着上面 
  2.     elif request.method == "POST"
  3.         form = LoginForm(request.POST, request.FILES) 
  4.         ########### 验证数据 
  5.         if form.is_valid(): 
  6.             # 验证成功 
  7.             # 验证成功之后的数据,key就是Form类的字段名 
  8.             print(form.cleaned_data)  # {'uname''1212''upwd''1212'
  9.             return HttpResponse("ok"
  10.         # 验证失败 
  11.         # 虽然返回的还是页面 
  12.         # 但是form会把上次输入框内容保存下来,并且还会展示errors信息 
  13.         return render(request, "login_f.html", {"form": form}) 

4.前端使用后端传过来的form对象。

方式一,点每个字段

  1. <form method="post" action="" novalidate> 
  2.     <div> 
  3.         <!-- form.uname.label点的是label属性  --> 
  4.         <label>{{ form.uname.label }}:</label> 
  5.         {{ form.uname }} 
  6.         <!-- 
  7.             form.uname.errors.0 是为了展示填写不正确的错误信息 
  8.             errors.0是因为错误可能有多个 
  9.             但是通常情况下,取第一个错误足够 
  10.          --> 
  11.         {{ form.uname.errors.0 }} 
  12.     </div> 
  13.     <div> 
  14.         <label>{{ form.upwd.label }}:</label> 
  15.         {{ form.upwd }} 
  16.         {{ form.upwd.errors.0 }} 
  17.     </div> 
  18.     <div><input type="submit"></div> 
  19. </form> 

方式二,循环form对象

form对象是可以循环的,循环的每个form对象就是每个字段对象。

  1. <form method="post" action="" novalidate> 
  2.     {% for foo in form %} 
  3.         <div> 
  4.             <label>{{ foo.label }}:</label> 
  5.             {{ foo }} 
  6.             {{ foo.errors.0 }} 
  7.         </div> 
  8.     {% endfor %} 
  9.     <div><input type="submit"></div> 
  10. </form> 
 所以,如果一个表有很多的字段时,尽可能的采用循环方式。
本文转载自网络,原文链接:https://mp.weixin.qq.com/s/4nXTsJAbYHP3LTcJHZHkFQ
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!
上一篇:让你的 JS 代码变得更加优雅且可维护 下一篇:没有了

推荐图文


随机推荐