手动的一个个去校验前端传过来的字段数据,是很麻烦的,利用django 的forms组件,对需要校验的字段定义好,能够大大提高效率。

校验字段功能

  1. from django.db import models
  2.  
  3. class UserInfo(models.Model):
  4. name = models.CharField(max_length=32)
  5. pwd = models.CharField(max_length=32)
  6. email = models.EmailField()
  7. tel = models.CharField(max_length=32)

app01/models.py

定义自己的forms,前端传过来的数据字段,要和forms里面的字段一样

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6.  
  7. </head>
  8. <body>
  9.  
  10. <form action="" method="post">
  11. {% csrf_token %}
  12. <div>
  13. <label for="user">用户名</label>
  14. <p><input type="text" name="name" id="name"></p>
  15. </div>
  16. <div>
  17. <label for="pwd">密码</label>
  18. <p><input type="password" name="pwd" id="pwd"></p>
  19. </div>
  20. <div>
  21. <label for="r_pwd">确认密码</label>
  22. <p><input type="password" name="r_pwd" id="r_pwd"></p>
  23. </div>
  24. <div>
  25. <label for="email">邮箱</label>
  26. <p><input type="text" name="email" id="email"></p>
  27. </div>
  28. <input type="submit">
  29. </form>
  30.  
  31. </body>
  32. </html>

register.html

  1. from django.forms import widgets
  2.  
  3. wid_01=widgets.TextInput(attrs={"class":"form-control"})
  4. wid_02=widgets.PasswordInput(attrs={"class":"form-control"})
  5.  
  6. class UserForm(forms.Form):
  7. name=forms.CharField(max_length=32,widget=wid_01)
  8. pwd=forms.CharField(max_length=32,widget=wid_02)
  9. r_pwd=forms.CharField(max_length=32,widget=wid_02)
  10. email=forms.EmailField(widget=wid_01)
  11. tel=forms.CharField(max_length=32,widget=wid_01)
  12.  
  13. def register(request):
  14.  
  15. if request.method=="POST":
  16. form=UserForm(request.POST)
  17. if form.is_valid():
  18. print(form.cleaned_data) # 所有干净的字段以及对应的值
  19. else:
  20. print(form.cleaned_data) #
  21. print(form.errors) # ErrorDict : {"校验错误的字段":["错误信息",]}
  22. print(form.errors.get("name")) # ErrorList ["错误信息",]
  23. return HttpResponse("OK")
  24. form=UserForm()
  25. return render(request,"register.html",locals())

forms组件与处理视图

渲染标签功能

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
  7. <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
  8. </head>
  9. <body>
  10. <h3>注册页面</h3>
  11. <div class="container">
  12. <div class="row">
  13. <div class="col-md-6 col-lg-offset-3">
  14.  
  15. <form action="" method="post">
  16. {% csrf_token %}
  17. <div>
  18. <label for="">用户名</label>
  19. {{ form.name }}
  20. </div>
  21. <div>
  22. <label for="">密码</label>
  23. {{ form.pwd }}
  24. </div>
  25. <div>
  26. <label for="">确认密码</label>
  27. {{ form.r_pwd }}
  28. </div>
  29. <div>
  30. <label for=""> 邮箱</label>
  31. {{ form.email }}
  32. </div>
  33.  
  34. <input type="submit" class="btn btn-default pull-right">
  35. </form>
  36. </div>
  37. </div>
  38. </div>
  39.  
  40. </body>
  41. </html>

渲染方式1

  1. <form action="" method="post">
  2. {% csrf_token %}
  3.  
  4. {% for field in form %}
  5. <div>
  6. <label for="">{{ field.label }}</label>
  7. {{ field }}
  8. </div>
  9. {% endfor %}
  10. <input type="submit" class="btn btn-default pull-right">
  11. </form>

渲染方式2

  1. <form action="" method="post">
  2. {% csrf_token %}
  3.  
  4. {{ form.as_p }}
  5. <input type="submit" class="btn btn-default pull-right">
  6.  
  7. </form>

渲染方式3

显示错误与重置输入信息功能

视图

  1. def register(request):
  2. if request.method=="POST":
  3. form=UserForm(request.POST)
  4. if form.is_valid():
  5. print(form.cleaned_data) # 所有干净的字段以及对应的值
  6. else:
  7. print(form.cleaned_data) #
  8. print(form.errors) # ErrorDict : {"校验错误的字段":["错误信息",]}
  9. print(form.errors.get("name")) # ErrorList ["错误信息",]
  10. return render(request,"register.html",locals())
  11. form=UserForm()
  12. return render(request,"register.html",locals())

模板

  1. <form action="" method="post" novalidate>
  2. {% csrf_token %}
  3.  
  4. {% for field in form %}
  5. <div>
  6. <label for="">{{ field.label }}</label>
  7. {{ field }} <span class="pull-right" style="color: red">{{ field.errors.0 }}</span>
  8. </div>
  9. {% endfor %}
  10. <input type="submit" class="btn btn-default">
  11.  
  12. </form>

局部钩子与全局钩子

  1. # forms组件
  2. from django.forms import widgets
  3.  
  4. wid_01=widgets.TextInput(attrs={"class":"form-control"})
  5. wid_02=widgets.PasswordInput(attrs={"class":"form-control"})
  6.  
  7. from django.core.exceptions import ValidationError
  8. class UserForm(forms.Form):
  9. name=forms.CharField(max_length=32,
  10. widget=wid_01
  11. )
  12. pwd=forms.CharField(max_length=32,widget=wid_02)
  13. r_pwd=forms.CharField(max_length=32,widget=wid_02)
  14. email=forms.EmailField(widget=wid_01)
  15. tel=forms.CharField(max_length=32,widget=wid_01)
  16.  
  17. # 局部钩子
  18. def clean_name(self):
  19. val=self.cleaned_data.get("name")
  20. if not val.isdigit():
  21. return val
  22. else:
  23. raise ValidationError("用户名不能是纯数字!")
  24.  
  25. # 全局钩子
  26.  
  27. def clean(self):
  28. pwd=self.cleaned_data.get("pwd")
  29. r_pwd=self.cleaned_data.get("r_pwd")
  30.  
  31. if pwd==r_pwd:
  32. return self.cleaned_data
  33. else:
  34. raise ValidationError('两次密码不一致!')
  35.  
  36. def register(request):
  37.  
  38. if request.method=="POST":
  39. form=UserForm(request.POST)
  40. if form.is_valid():
  41. print(form.cleaned_data) # 所有干净的字段以及对应的值
  42. else:
  43. clean_error=form.errors.get("__all__")
  44.  
  45. return render(request,"register.html",locals())
  46. form=UserForm()
  47. return render(request,"register.html",locals())

view

---

app01/myforms.py

  1. from django import forms
  2. from django.forms import widgets
  3. from app01.models import UserInfo
  4.  
  5. from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
  6.  
  7. class UserForm(forms.Form):
  8. name = forms.CharField(min_length=4, label="用户名", error_messages={"required": "该字段不能为空"}, # label 用于前端展示
  9. widget=widgets.TextInput(attrs={"class": "form-control"})
  10. ) # html挂件
  11. pwd = forms.CharField(min_length=4, label="密码",
  12. widget=widgets.PasswordInput(attrs={"class": "form-control"})
  13. )
  14. r_pwd = forms.CharField(min_length=4, label="确认密码", error_messages={"required": "该字段不能为空"},
  15. widget=widgets.TextInput(attrs={"class": "form-control"}))
  16. email = forms.EmailField(label="邮箱", error_messages={"required": "该字段不能为空", "invalid": "格式错误"},
  17. widget=widgets.TextInput(attrs={"class": "form-control"}))
  18. tel = forms.CharField(label="手机号", widget=widgets.TextInput(attrs={"class": "form-control"}))
  19.  
  20. # 对字段进行校验 clean_xx , 验证完记得要返回对应字段值
  21. def clean_name(self):
  22. val = self.cleaned_data.get("name") # cleaned_data 提交过来的干净的字段数据
  23. ret = UserInfo.objects.filter(name=val)
  24.  
  25. if not ret:
  26. return val
  27. else:
  28. raise ValidationError("该用户已注册!")
  29.  
  30. def clean_tel(self):
  31. val = self.cleaned_data.get("tel")
  32. if len(val) == 11:
  33. return val
  34. else:
  35. raise ValidationError("手机号格式错误")
  36.  
  37. def clean(self):
  38. pwd = self.cleaned_data.get('pwd')
  39. r_pwd = self.cleaned_data.get('r_pwd')
  40.  
  41. if pwd and r_pwd:
  42. if pwd == r_pwd:
  43. return self.cleaned_data
  44. else:
  45. raise ValidationError('两次密码不一致')
  46. else:
  47. return self.cleaned_data # 要返回数据

myforms.py

处理视图

  1. from django.shortcuts import render
  2.  
  3. from app01.myforms import *
  4.  
  5. def reg(request):
  6. if request.method == "POST":
  7.  
  8. # print(request.POST)
  9.  
  10. # form=UserForm({"name":"yu","email":"123@qq.com","xxxx":"alex"})
  11.  
  12. form = UserForm(request.POST) # 前端传过来的form表单的name属性值应该与forms组件字段名称一致
  13.  
  14. # print(form.is_valid()) # 返回布尔值
  15.  
  16. if form.is_valid():
  17. print(form.cleaned_data) # {"name":"yuan","email":"123@qq.com"}
  18. else:
  19. print(form.cleaned_data) # {"email":"123@qq.com"}
  20. # print(form.errors) # {"name":[".........."]}
  21. # print(type(form.errors)) # ErrorDict
  22. # print(form.errors.get("name"))
  23. # print(type(form.errors.get("name"))) # ErrorList
  24. # print(form.errors.get("name")[0])
  25.  
  26. # 全局钩子错误
  27. # print("error",form.errors.get("__all__")[0])
  28. errors = form.errors.get("__all__")
  29.  
  30. return render(request, "reg.html", locals())
  31.  
  32. '''
  33.  
  34. form.is_valid() :返回布尔值
  35. form.cleaned_data :{"name":"yuan","email":"123@qq.com"}
  36. form.errors :{"name":[".........."]}
  37.  
  38. '''
  39.  
  40. form = UserForm()
  41.  
  42. return render(request, "reg.html", locals())

app01/views.py

提交模板

模板渲染的3种方式

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style>
  7. .error{
  8. color: red;
  9. }
  10. </style>
  11. <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
  12. <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"
  13. integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
  14. </head>
  15. <body>
  16.  
  17. <div class="container">
  18.  
  19. <div class="row">
  20. <div class="col-md-6 col-lg-offset-3">
  21.  
  22. {#<h3>简单form</h3>#}
  23. {##}
  24. {##}
  25. {#<form action="" method="post" novalidate>#}
  26. {# {% csrf_token %}#}
  27. {# <p>用户名<input type="text" name="name"></p>#}
  28. {# <p>密码 <input type="text" name="pwd"></p>#}
  29. {# <p>确认密码 <input type="text" name="r_pwd"></p>#}
  30. {# <p>邮箱 <input type="text" name="email"></p>#}
  31. {# <p>手机号 <input type="text" name="tel"></p>#}
  32. {# <input type="submit">#}
  33. {##}
  34. {#</form>#}
  35.  
  36. <hr>
  37. <h3>forms组件渲染方式1</h3>
  38. <form action="" method="post" novalidate> {# 自己校验 #}
  39.  
  40. {% csrf_token %}
  41. <p>{{ form.name.label }}
  42. {{ form.name }} <span class="pull-right error">{{ form.name.errors.0 }}</span>
  43. </p>
  44. <p>{{ form.pwd.label }}
  45. {{ form.pwd }} <span class="pull-right error">{{ form.pwd.errors.0 }}</span>
  46. </p>
  47. <p>确认密码
  48. {{ form.r_pwd }} <span class="pull-right error">{{ form.r_pwd.errors.0 }}</span><span class="pull-right error">{{ errors.0 }}</span>
  49. </p>
  50. <p>邮箱 {{ form.email }} <span class="pull-right error">{{ form.email.errors.0 }}</span></p>
  51. <p>手机号 {{ form.tel }} <span class="pull-right error">{{ form.tel.errors.0 }}</span></p>
  52. <input type="submit">
  53.  
  54. </form>
  55.  
  56. {#<h3>forms组件渲染方式2</h3>#}
  57. {##}
  58. {#<form action="" method="post" novalidate>#}
  59. {# {% csrf_token %}#}
  60. {##}
  61. {# {% for field in form %}#}
  62. {##}
  63. {# <div>#}
  64. {# <label for="">{{ field.label }}</label>#}
  65. {# {{ field }}#}
  66. {# </div>#}
  67. {##}
  68. {# {% endfor %}#} {# 每行的错误信息不好展示 #}
  69. {##}
  70. {# <input type="submit">#}
  71. {#</form>#}
  72. {##}
  73.  
  74. {#<h3>forms组件渲染方式3 用的比较少</h3>#}
  75. {##}
  76. {#<form action="" method="post">#}
  77. {# {% csrf_token %}#}
  78. {##}
  79. {# {{ form.as_p }}#}
  80. {##}
  81. {# <input type="submit">#}
  82. {#</form>#}
  83.  
  84. </div>
  85. </div>
  86. </div>
  87.  
  88. </body>
  89. </html>

templates/reg.html

错误信息在定义forms的时选择添加与否

dj forms表单组件的更多相关文章

  1. Django form表单 组件

    目录 Django form表单 组件 Form 组件介绍 普通方式手写注册功能 使用form组件实现注册功能 Form 常用字段与插件 常用字段(必备) 字段参数(必备) 内置验证(必备) 自定义效 ...

  2. 微信小程序-表单组件

    button 按钮 注:button-hover 默认为{background-color: rgba(0, 0, 0, 0.1); opacity: 0.7;} 示例代码: /** wxss **/ ...

  3. Vue组件之自定义表单组件

    今天又看了一遍vue的文档,记得之前学习的时候,官方文档中有提过,v-model指令是一个语法糖,做两件事,一个是给表单控件元素绑定value,第二个是当输入时更新绑定的值,不过后来在"表单 ...

  4. Form( 表单) 组件

    本节课重点了解 EasyUI 中 Form(表单)组件的使用方法, 这个组件不依赖于任何组件.一. 加载方式表单组件只能在 JS 区域设置,首先定义一张表单.<form id="box ...

  5. 实现Ant Design 自定义表单组件

    Ant Design 组件提供了Input,InputNumber,Radio,Select,uplod等表单组件,但实际开发中这是不能满足需求,同时我们希望可以继续使用Form提供的验证和提示等方法 ...

  6. 页面注册系统--使用forms表单结合ajax

    页面注册系统--使用forms表单结合ajax 在Django中通过forms构建一个表单 1.urls.py 配置路由 from django.conf.urls import url from d ...

  7. Python的Django框架中forms表单类的使用方法详解

    用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...

  8. 「小程序JAVA实战」小程序的表单组件(25)

    转自:https://idig8.com/2018/08/18/xiaochengxujavashizhanxiaochengxudebiaodanzujian25/ 来说下 ,小程序的基础组件.源码 ...

  9. 第二百二十一节,jQuery EasyUI,Form(表单)组件

    jQuery EasyUI,Form(表单)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解 EasyUI 中 Form(表单)组件的使用方法,这个组件不依赖于 ...

随机推荐

  1. 脚手架搭建vue框架

    一. node安装 1)如果不确定自己是否安装了node,可以在命令行工具内执行: node -v  (检查一下 版本): 2)如果 执行结果显示: xx 不是内部命令,说明你还没有安装node , ...

  2. [leetcode]101. Symmetric Tree对称树

    Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...

  3. linux命令学习之:route

    我们在网络基础的时候谈过关于路由的问题,两台主机之间一定要有路由才能够互通TCP/IP的协议,否则就无法进行联机.一般来说,只要有网络接口,该接口就会产生一个路由,例如:eth0及lo. route命 ...

  4. 通过PHP CURL模拟请求上传文件|图片。

    现在有一个需求就是在自己的服务器上传图片到其他服务器上面,过程:客户端上传图片->存放到本地服务器->再转发到第三方服务器; 由于前端Ajax受限制,只能通过服务器做转发了. 在PHP中通 ...

  5. ubuntu下安装nginx1.11.10

    (本页仅作为个人笔记参考) 为openssl,zlib,pcre配置编译 wget http://om88fxbu9.bkt.clouddn.com/package/nginx/nginx-1.11. ...

  6. 自动化运维工具 SaltStack 搭建

    原文地址:https://www.ibm.com/developerworks/cn/opensource/os-devops-saltstack-in-cloud/index.html#N10072 ...

  7. rbac 表结构的。设计

    1. 问:为什么程序需要权限控制? 答:生活中的权限限制,① 看灾难片电影<2012>中富人和权贵有权登上诺亚方舟,穷苦老百姓只有等着灾难的来临:② 屌丝们,有没有想过为什么那些长得漂亮身 ...

  8. 在BCH硬分叉后防止重放攻击-1

    导致新加密货币的硬分叉为加密交换运营商带来了独特的机遇和挑战.Poloniex在最近的Bitcoin Cash硬叉之后面临的一个挑战是保护我们的客户免受重播攻击.由于SV链后面的开发团队选择在分叉后近 ...

  9. select into tb_temp2 from tb_temp1 创建临时表实现上一个、下一个功能,使用完毕就删除临时表

    好久没有写过Sql了,今天遇到一个问题,业务逻辑是: 一个商品可以属于多个分类,在显示商品详情的时候,要求可以点击“上一个”,“下一个” 查看和该商品在同一个分类下的其他商品,商品具有排序号. 这样我 ...

  10. Windows下PythonQt编译(vs2015+Qt5.11.2+PythonQt 3.2)探索

    时间:2018年10月20日 笔者最近在做Qt方面的开发工作,需用到脚本程序对程序内部进行扩展,就很自然的想到了PythonQt,下面介绍PythonQt在Windows下的的安装编译心得,水平有限, ...