Forms组件的使用

在html表单验证中,需要通过各种信息的验证,比如注册界面的姓名、密码、邮箱、电话等的验证,是否符合定义好的规则,不可能每次都要取出对应的字段一一判断,django内置了Forms组件,可以方便的在HTML中进行校验等信息设置

1.Forms组件的作用

1.数据校验

2.渲染页面

3.渲染错误信息

4.使用局部或者全局的钩子函数

5.设置CSS样式

2.Forms组件的使用

  • 1.导入froms模块 from django import forms
  • 2.定义一个类继承自forms.Form,编写校验的字段,该字段就是html页面上提交数据上传的字段
class RegisterForms(Form):

    # 添加的字段类型中的属性,每个子类都继承自field,
#field中对应的属性和释义
#required=True, 是否是必须验证,默认为True
#widget=None, HTML插件,添加类名,设置placeholder等等
#label=None, 用于生成Label标签或显示内容
#initial=None, 初始值
#help_text='', 帮助信息(在标签旁边显示)
#error_messages=None, 错误信息 {'required': '不能为空', 'invalid': '格式错误'}
#validators=[], 自定义验证规则
#localize=False, 是否支持本地化
#disabled=False, 是否可以编辑
#label_suffix=None Label内容后缀 name = forms.CharField(min_length=3,max_length=8,
label="用户名",
error_messages={'min_length':'用户名最少为3位',
'max_length':'用户名最多8位',
'required':'名称不能为空'}) pwd = forms.CharField(min_length=6, max_length=20,
label='请输入密码',
error_messages={'min_length':'密码最少为6位',
'max_length':'密码最多20位',
'required':'密码不能为空'}) re_pwd = forms.CharField(min_length=6, max_length=20,
label='请确认密码',
error_messages={'min_length':'密码最少为6位',
'max_length':'密码最多20位',
'required':'密码不能为空'}) phone = forms.CharField(label="请输入手机号码",
error_messages={'placerholder': '请输入手机号码'}) email = forms.EmailField(label='请输入邮箱',required=False,
error_messages={'invalid':'邮箱格式不合法',
'max_length':'密码最多20位'})
# 对于多传的字段不会出错,cleaned_data中不包含多传的字段
# 少传的字段会报错,相当于对应的字段没有值
  • 3.在对应的views视图中进行校验,
def form_index(request):
post_forms = RegisterForms()
error = ''
if request.method == 'POST':
post_forms = RegisterForms(request.POST)
# 4 调用forms的is_valid方法,完成校验,is_valid返回true或者false
if post_forms():
register = post_forms.cleaned_data
print(register)
return HttpResponse('注册成功')
else:
from django.forms.utils import ErrorDict
# 获取全局的error信息,只显示第一个
if post_forms.errors.get('__all__'):
error = post_forms.errors.get('__all__')[0] return render(request, 'FormsTest/forms_index.html',locals())
  • 4.通过模板渲染,渲染模板有如下几种方式,具体使用如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>forms登录</title>
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
<script src="{% static 'jquery-3.3.1.js' %}"></script>
<style>
.edit-author{
margin: 100px 300px;
}
.errorinfo{
color: red;
font-size: 15px;
padding-left: 15px;
} </style>
</head>
<body> <div class="edit-author">
{# <form action="" method="post">#}
{# {% csrf_token %}#}
{# <div class="form-group">#}
{# <label for="exampleInputEmail1">用户名</label>#}
{# <input type="text" name="name" class="form-control" placeholder="请输入用户名" >#}
{# </div>#}
{# <div class="form-group">#}
{# <label for="exampleInputPassword1">密码</label>#}
{# <input type="password" name="pwd" class="form-control" placeholder="请输入密码">#}
{# </div>#}
{# <div class="form-group">#}
{# <label for="exampleInputPassword1">确认密码</label>#}
{# <input type="password" name="re_pwd" class="form-control" placeholder="请确认密码">#}
{# </div>#}
{# <div class="form-group">#}
{# <label for="exampleInputPassword1">邮箱</label>#}
{# <input type="email" name="email" class="form-control" placeholder="请输入邮箱">#}
{# </div>#}
{##}
{# <button type="submit" id="clickBtn" class="btn btn-default submit-button">注册</button>#}
{# <span id="error"></span>#}
{# </form>#} {# forms渲染页面第一种方式#}
{# <form action="" method="post">#}
{# {% csrf_token %}#}
{# <div class="form-group">#}
{# <label for="exampleInputEmail1">用户名</label>#}
{# {{ post_forms.name }}#}
{# </div>#}
{# <div class="form-group">#}
{# <label for="exampleInputPassword1">密码</label>#}
{# {{ post_forms.pwd }}#}
{# </div>#}
{# <div class="form-group">#}
{# <label for="exampleInputPassword1">确认密码</label>#}
{# {{ post_forms.re_pwd }}#}
{# </div>#}
{# <div class="form-group">#}
{# <label for="exampleInputPassword1">邮箱</label>#}
{# {{ post_forms.email }}#}
{# </div>#}
{# <button type="submit" id="clickBtn" class="btn btn-default submit-button">注册</button>#}
{# </form>#} {# forms渲染页面第二种方式,推荐使用#}
<form action="" method="post" novalidate>
{% csrf_token %}
{% for foo in reg_forms %}
<div class="form-group">
{# errors是一个列表,一般取第一个就可以了,这样不会换行处理#}
<label for="exampleInputEmail1">{{ foo.label }}</label>
<span class="errorinfo"> {{ foo.errors.0 }}</span>
{{ foo }}
</div>
{% endfor %}
<button type="submit" id="clickBtn" class="btn btn-default submit-button">注册</button>
<span class="errorinfo">{{ error }} </span>
</form> {# forms渲染页面第二种方式,不推荐使用#}
{# <form action="" method="post">#}
{# {% csrf_token %}#}
{# {{ post_forms.as_p }}#}
{# {{ post_forms.as_ul }}#}
{# {{ post_forms.as_table }}#}
{# <button type="submit" id="clickBtn" class="btn btn-default submit-button">注册</button>#}
{# </form>#} </div> </body>
</html>

  • 5.上面只是实现了部分的校验,而且展示的样式需要手动渲染,我们可以在定义模型的时候直接设置好对应的css展示样式和自定义校验规则,比如电话号码的正则校验等等
#导入widgets模块,设置css的展示样式
from django.forms import widgets #接下来修改对应的name,pwd,phone等字段,添加新属性,如下添加了占位符和类名这个时候的登录界面就和上面的一样 name = forms.CharField(min_length=3,max_length=8,
label="用户名",
widget=widgets.TextInput(attrs={'class': 'form-control',
'placeholder': '请输入名称(3-8字符)'}),
error_messages={'min_length':'用户名最少为3位',
'max_length':'用户名最多8位',
'required':'名称不能为空'}) pwd = forms.CharField(min_length=6, max_length=20,
label='请输入密码',
widget=widgets.PasswordInput(attrs={'class':'form-control',
'placeholder':'请输入密码(6-20字符)'}),
error_messages={'min_length':'密码最少为6位',
'max_length':'密码最多20位',
'required':'密码不能为空'}) re_pwd = forms.CharField(min_length=6, max_length=20,
label='请确认密码',
widget=widgets.PasswordInput(attrs={'class': 'form-control',
'placeholder': '请确认密码'}),
error_messages={'min_length':'密码最少为6位',
'max_length':'密码最多20位',
'required':'密码不能为空'}) phone = forms.CharField(label="请输入手机号码",
widget=widgets.TextInput(attrs={'class': 'form-control',
'placeholder': '请输入手机号码'}),
error_messages={'placerholder': '请输入手机号码'}) email = forms.EmailField(label='请输入邮箱',required=False,
widget=widgets.TextInput(attrs={'class': 'form-control',
'placeholder': '请输入邮箱'}),
error_messages={'invalid':'邮箱格式不合法',
'max_length':'密码最多20位'})
  • 6.自定义校验规则,有时django自带的校验并不能满足我们所有的需求,比如校验密码输入,不能用特殊字符,手机号码格式定义正则等,这就需要我们自定义规则
#自定义校验规则
def mobile_validate(value):
mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
if not mobile_re.match(value):
raise ValidationError('手机号码格式错误') #在定义字段的时候添加校验规则,校验规则传入的是一个列表,可以有多个校验规则
phone = forms.CharField(label="请输入手机号码",
validators=[mobile_validate,],
widget=widgets.TextInput(attrs={'class': 'form-control',
'placeholder': '请输入手机号码'}),
error_messages={'placerholder': '请输入手机号码'})
  • 7.自定义钩子,实现自定义的错误提示和校验规则,
#Django中钩子分为局部钩子和全局钩子,
# 局部钩子函数(某个字段,自定义的规则,数据库是否存在,以什么开头)
# 方法名必须为:clean_字段名
def clean_name(self):
#获取到当前对象,是cleaned_data之后的数据
name = self.cleaned_data.get('name')
if name.startswith('sb'):
#以sb开头了返回错误信息,禁止使用sb开头的用户名
raise ValidationError('不能以sb开头')
# 数据库中查询有没有这个名称
user = models.UserInfo.objects.filter(username=name).first()
if user:
raise ValidationError('用户名已存在')
return name #全局钩子,方法名必须是clean
#校验两次密码是否相同等,
def clean(self):
pwd = self.cleaned_data.get('pwd')
re_pwd = self.cleaned_data.get('re_pwd')
if pwd == re_pwd:
return self.cleaned_data
else:
raise ValidationError('两次密码不一致')

3.最后实现的效果如下图

Django--Forms组件使用的更多相关文章

  1. Django forms组件里的ChoiceField、ModelChoiceField和ModelMutipleChoiceField的区别

    阅读简要 首先我们要明白Django forms组件里的ChoiceField.ModelChoiceField和ModelMutipleChoiceField是继承关系 ChoiceField 1. ...

  2. python django(forms组件)

    forms组件最大的作用,就是做数据校验. 普通做法,一个一个写校验规则,没有解耦.校验规则,都在视图函数里面. 网页校验 修改urls.py,增加路径addbook from app01 impor ...

  3. django ---forms组件

    forms组件 本文目录 1 校验字段功能 2 渲染标签功能 3 渲染错误信息功能 4 组件的参数配置 5 局部钩子 6 全局钩子 回到目录 1 校验字段功能 针对一个实例:注册用户讲解. 模型:mo ...

  4. Django forms组件与钩子函数

    目录 一.多对多的三种创建方式 1. 全自动 2. 纯手撸(了解) 3. 半自动(强烈推荐) 二.forms组件 1. 如何使用forms组件 2. 使用forms组件校验数据 3. 使用forms组 ...

  5. Django forms组件的校验

    引入: from django import forms 使用方法:定义规则,例: class UserForm(forms.Form): name=forms.CharField(max_lengt ...

  6. Django学习之八:forms组件【对form舒心了】

    目录 Django forms组件 bound and unbound form instance forms渲染有关 隐藏一个字段,不渲染它 form 校验 form类 ModelForm 利用Mo ...

  7. Django-多对多关系的三种创建方式-forms组件使用-cookie与session-08

    目录 表模型类多对多关系的三种创建方式 django forms 组件 登录功能手写推理过程 整段代码可以放过来 forms 组件使用 forms 后端定义规则并校验结果 forms 前端渲染标签组件 ...

  8. Django组件-Forms组件

    Django的Forms组件主要有以下几大功能: 页面初始化,生成HTML标签 校验用户数据(显示错误信息) HTML Form提交保留上次提交数据 一.小试牛刀 1.定义Form类 from dja ...

  9. Django组件--forms组件(注册用)

    一.forms组件--校验类的使用 二.form组件--校验类的参数 三.forms组件校验的局部钩子--自定义校验规则(要看源码理解) 四.forms组件校验的全局钩子--校验form表单两次密码输 ...

  10. web框架开发-Django的Forms组件

    校验字段功能 针对一个实例:用户注册. 模型:models.py class UserInfo(models.Model): name=models.CharField(max_length=32) ...

随机推荐

  1. python-列表元祖字典集合

    列表 list = ["a", "b", "c", "d"]元祖 tup = (1, 2, 3, 4, 5 ) 1.元组 ...

  2. web css

    CSS圆角——透明圆角化背景图片 序言:第一章中我介绍了最基本的纯CSS圆角框的实现原理,并给出Demo,在本章中会对上一个模型作一些新的创新,实现将背景图片透明圆角化.并给出一些漂亮的通用演示效果. ...

  3. SQL语句中 (+) 含义

    (+) 表示外连接.条件关联时,一般只列出表中满足连接条件的数据.如果条件的一边出现(+),则可列出该表中在条件另一侧的数据为空的那些记录.比如两个表:员工表和工资表.员工表中有总经理.A.B.C四条 ...

  4. SpringMVC-设计模式

    MVC 设计不仅限于 Java Web 应用,还包括许多应用,比如前端.PHP..NET 等语言.之所以那么做的根本原因在于解耦各个模块. MVC 是 Model.View 和 Controller ...

  5. 容器宽高不确定,图片宽高不确定,css如何实现图片响应式?

    图片响应式 在响应式开发中最烦恼的应该就是图片了,虽然图片设置max-width: 100%;可以让图片宽度占满容器,但是高度就不能自适应了.如果将容器高度限死,那么我们就要使用媒体查询来控制容器的高 ...

  6. html5: postMessage解决跨域通信的问题

    效果图 postmessage解析 HTML5提供了新型机制PostMessage实现安全的跨源通信. 语法 otherWindow.postMessage(message, targetOrigin ...

  7. CF E2 - Daleks' Invasion (medium) (LCA求两点树上路径上的最大边权)

    http://codeforces.com/contest/1184/problem/E2 题意:给出一副图,首先求出这幅图的最小生成树 , 然后修改这幅图上不属于最小生成树的边权,使得修改后的图在求 ...

  8. 洛谷P1441 砝码称重(搜索,dfs+dp)

    洛谷P1441 砝码称重 \(n\) 的范围为 \(n \le 20\) ,\(m\) 的范围为 \(m \le 4\) . 暴力遍历每一种砝码去除情况,共有 \(n^m\) 种情况. 对于剩余砝码求 ...

  9. 【OPCAutomation】 使用OPCAutomation实现对OPC数据的访问

    折腾了一段时间研究OPC,理清了下位机.OPCServer 和OPCClient的关系和通信模型,终于能够来写一篇相关的博客了. 我们使用西门子的 S7 200 SMART作为下位机端,通过3G路由器 ...

  10. 深入理解Redis的持久化机制和原理

    Redis是一种面向“key-value”类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却十分迅速. 近日,Redis的作者在博客中写到, ...