一篇文章带你了解Django Form组件(入门篇)

前言

Hey,大家好呀,我是码农,星期八。

本次咱们来get一个新技能,Form组件。

Form组件主要用于验证表单数据

为什么需要Form组件

注:Form组件,只适用于,前后端未分离的项目中,主要用于验证表单数据,所以,关键字是表单!!!

比如像哔哩哔哩的注册界面

我点击注册,它不仅仅可以知道我的注册昵称是否存在,密码是否小于6位,手机号格式错误

还会把错误信息一直留在上面,给我提示。

我们就以这个为雏形,来简单的写一个小小的注册界面

普通版注册

代码

urls.py

1from django.urls import path 2from web import views 3 4urlpatterns = [ 5 path('reg/', views.reg,), 6]

web/views.py

1 2def reg(request): 3 if request.method == "GET": 4 return render(request, "reg.html") 5 6 nick = request.POST.get("nick") 7 pwd = request.POST.get("pwd") 8 phone = request.POST.get("phone") 9 10 error = {} 11 if len(pwd) < 6: 12 error["pwd"] = "密码小于6位" 13 if len(phone) != 11: 14 error["phone"] = "手机号格式错误" 15 16 # error为空表示未触发异常 17 if not error: 18 print("写入数据库", nick, pwd, phone) 19 return HttpResponse("注册成功") 20 else: 21 return render(request, "reg.html", {"error": error})

templates/reg.html

1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8"> 5 <title>登录</title> 6</head> 7<body> 8<div style="width: 40%;margin: auto"> 9 <form action="" method="post"> 10 <div><input name="nick" type="text" placeholder="昵称"></div> 11 <div> 12 <input name="pwd" type="password" placeholder="密码"> 13 <span>{{ error.pwd }}</span> 14 </div> 15 <div> 16 <input name="phone" type="text" placeholder="手机号"> 17 <span>{{ error.phone }}</span> 18 </div> 19 <div><input type="submit"></div> 20 </form> 21</div> 22 23</body> 24</html>

实现效果

如果填写的信息正常。

填写信息

跳转之后

如果填写的信息错误。

填写信息

错误提示

小总结

但是你发现虽然能把错误信息显示出来。

但是我原来填写的东西没了啊!!!,因为html form表单提交是刷新页面提交的!

雾草,没了,这是少的,如果有十几个???,那不就气死了

好像我记得我上学时,好多网站都是这。。。好像我也骂了很久,直到前后端分离时,才好一点!

Form组件版注册

再使用之前,需要将Django项目的settings.pyLANGUAGE_CODE设置为zh-hans

代码

以下代码可能看不懂,大概理解就好!

urls.py

同上

web/views.py

1 2from django.shortcuts import render, HttpResponse 3from django.forms import Form 4from django.forms import fields 5from django.forms import widgets 6 7 8# Create your views here. 9class RegForm(Form): 10 name = fields.CharField( 11 widget=widgets.TextInput(attrs={"placeholder": "昵称"}) 12 ) 13 pwd = fields.CharField( 14 min_length=6, 15 widget=widgets.TextInput(attrs={"placeholder": "密码"}) 16 ) 17 phone = fields.CharField( 18 min_length=11, 19 max_length=11, 20 widget=widgets.TextInput(attrs={"placeholder": "手机号"}) 21 ) 22 23 24def reg(request): 25 if request.method == "GET": 26 form = RegForm() 27 return render(request, "reg.html", {"form": form}) 28 form = RegForm(request.POST, request.FILES) 29 # 验证表单数据 30 if form.is_valid(): 31 result = form.clean() 32 print(result) 33 return HttpResponse("登录") 34 return render(request, "reg.html", {"form": form})

templates/reg.html

1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8"> 5 <title>登录</title> 6</head> 7<body> 8<div style="width: 40%;margin: auto"> 9 <form action="" method="post" novalidate> 10 {% for foo in form %} 11 <div> 12 {{ foo }} 13 <span style="color: red">{{ foo.errors.0 }}</span> 14 </div> 15 {% endfor %} 16 <div><input type="submit"></div> 17 </form> 18</div> 19 20</body> 21</html>

实现效果

如果填写的信息正常。

同上

如果填写的信息错误。

小总结

这是我点击提交之后报错的结果!

可以发现,即使刷新页面提交,还是会把原来的数据保存下来,并且还有验证失败的信息

Form总结

从上述示例可以发现。

Django Form组件最起码具有以下功能:

  • 生成HTML标签。

  • 验证提交的数据。

  • 保留提交之前的数据。

没错,它的主要功能其实也就是这。

如果使用Django进行开发,并且使没有前后端分离的,必用Form组件!

如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。

每一份发奋努力的背后,必定有巨大的赏赐。

我是码农星期八,如果觉得还不错,记得动手点赞一下哈。

感谢你的观看。

如果你觉得文章还可以,记得点赞留言支持我们哈。感谢你的阅读,有问题请记得在下方留言噢~

想学习更多关于Python的知识,可以参考学习网址:http://pdcfighting.com/,点击阅读原文,可以直达噢~

-------------------********************************** End **********-------------**-----********-**********************************

往期精彩文章推荐:

欢迎各位大佬点击链接加入群聊【helloworld开发者社区】:https://jq.qq.com/?_wv=1027&k=mBlk6nzX进群交流IT技术热点。

本文转自 https://mp.weixin.qq.com/s/2fjSz84mbmfcEiwniQvVrg,如有侵权,请联系删除。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

vue+element 表格formatter数据格式化并且插入html标签

前言   vue中element框架,其中表格组件,我既要行内数据格式化,又要插入html标签一贯思维,二者不可兼得也一、element表格数据格式化  !(https://oscimg.oschina.net/oscnet/3c43a1cb3cbdeb5b5ad58acb45a42612b00.p