手动的一个个去校验前端传过来的字段数据,是很麻烦的,利用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. HDU 4027 Can you answer these queries? (线段树区间修改查询)

    描述 A lot of battleships of evil are arranged in a line before the battle. Our commander decides to u ...

  2. Properties 使用

    Properties 属于Map 下HashTable的小弟 属于持久的属性集,他可以保存在流中或者在流中加载. 键和值都是字符串类型. 通常用于配置文件 方法介绍: 存放键值对:setPropert ...

  3. Android自定义view(一):制作一个最最最简单的自定义view

    转载:https://blog.csdn.net/wsyizmao/article/details/78491422 浅谈安卓自定义view(一):制作一个最最最简单的自定义view 对于安卓程序员来 ...

  4. 利用scp 远程上传下载文件/文件夹

    scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port ...

  5. tomcat实现多端口、多域名访问(只针对一个tomcat)

    说明:这个部分介绍如何在tomcat中进行配置,使同一个应用可以通过不同的端口号进行访问. 在某些需要进行安全控制的场景中会应用到.例如:不同地址段只能通过某个端口访问. 2 找到tomcat的主目录 ...

  6. .NET垃圾回收机制

    在.net 编程环境中,系统的资源分为托管资源和非托管资源.  对于托管的资源的回收工作,是不需要人工干预回收的,而且你也无法干预他们的回收,所能够做的只是了解.net CLR如何做这些操作.也就是说 ...

  7. python3.6.5 路径处理与规范化

    在Linux和Mac平台上,该函数会原样返回path,在windows平台上会将路径中所有字符转换为小写,并将所有斜杠转换为饭斜杠. >>> os.path.normcase('c: ...

  8. Charles基本使用

    Charles使用 查找电脑IP,菜单选项helpàLocal IP Addresses 手机连接代理 手机打开WiFi,把代理模式设置为手动,设置主机名为Charles所在机器的ip,端口号为Cha ...

  9. 关于sortedlist 中值的添加,删除,索引测试.

    SortedList 类代表了一系列按照键来排序的键/值对,这些键值对可以通过键和索引来访问. 排序列表是数组和哈希表的组合.它包含一个可使用键或索引访问各项的列表.如果您使用索引访问各项,则它是一个 ...

  10. 2Y - sort

    给你n个整数,请按从大到小的顺序输出其中前m大的数.  Input 每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-5000 ...