1.引入案例

  • 实现注册功能

    • 用户名不能含有"卧槽",如果用户输入,就提示输入内容不合法
    • 密码至少有6位,否则提示密码太短
  • 说明

    • 通常前后端都会校验数据
    • 前端校验可以没有,但后端校验必须有

2. form组件的功能

  • 渲染页面:搭建前端页面
  • 校验数据:获取前端用户提交的数据校验
  • 展示错误信息:将数据的校验结果返回到前端展示给用户

3. form组件的使用

3.1 自定义form校验类

# views.py
from django import forms class MyForm(forms.Form):
username = forms.CharField(min_length=4, max_length=16)
password = forms.CharField(min_length=6, max_length=16)
email = forms.EmailField()

3.2 校验数据

  • 校验数据合法性
from app01 import views

# 将要校验的数据以字典的形式传给自定义的类
obj = views.MyForm({'username': 'qwer', 'password': '1234','email': 'ema'}) # 判断数据是否合法
print(obj.is_vaild()) # 所有数据都负荷要求才返回True # 查看符合校验条件的数据
print(obj.clean_data) # 此处username符合 # 查看不符合校验条件的数据
print(obj.errors)
# 此处password与email不符合,结果如下
{
'password':['Ensure this value has at least 6 characters (it has 4).'],
'email': ['Enter a valid email address.']
}
  • 校验数据时多传或少传值的情况
from app01 import views

# 少传值的情况
obj = views.MyForm({'username': 'qwer', 'password': '123456'})
print(obj.is_vaild) # False
print(obj.errors) # {'email': ['This field is required.']} # 多传值的情况
obj = views.MyForm({'username': 'qwer', 'password': '123456', 'email': 'qwer@qq.com', 'abc': '123'})
print(obj.is_vaild) # True
  • 说明

    默认情况下,可以多传值,但绝对不能少传

3.3 渲染页面

  • forms组件只会渲染获取用户输入的标签,提交按钮需要自己手动写
  • 三种渲染前端页面的方式
{# 第一种:封装程度太高,标签参数不方便调整,可扩展性差(不推荐) #}
{{ form_obj.as_p }}
{{ form_obj.as_ul }} {# 第二种:可扩展性高,但手写的代码较多,不推荐 #}
<p>
{{ form_obj.username.label }}{{ form_obj.username }}
</p>
<p>
{{ form_obj.password.label }}{{ form_obj.password }}
</p>
<p>
{{ form_obj.email.label }}{{ form_obj.email }}
</p> {# 第三种:可拓展性高,代码简洁,推荐使用 #}
{% for foo in for_obj %}
<p>
{{ foo.label }}{{ foo }}
</p>
{% endfor %}

3.4 展示错误信息

  • 取消前端校验的方法
{# 如果我们使用了form组件,前端就会帮我们做校验,但是我们不想使用前端校验 #}
{# 在for标签中添加novaildate #}
<form action='' method='post' novalidate></form>
  • 展示错误信息
{# 对象.errors.0 #}
<form action='' method='post' novalidate>
{% for foo in form_obj %}
<p>
{{ foo.label }}{{ foo }}
<span style='color:red'>{{ foo.errors.0 }}</span>
</p>
{% endfor %} <input type='submit'>
</form>

3.5 自定义校验结果

  • 修改错误信息,在error_messages中

    • 输入为空错误信息:required
    • 邮箱格式错误信息:invalid
  • 修改label名:label='用户名'
  • 设置初始值:initial='初始值'
  • 此项可以为空:required=False
from django import forms

class MyForm(forms.Form):
username = forms.CharField(min_length=4, max_length=16, label='用户名',
error_messages={
'min_length': '用户名最短4位',
'max_length': '用户名最多16位',
'required': '用户名不能为空',
},
initial='初始值'
)
password = forms.CharField(min_length=6, max_length=16, label='密码',
error_messages={
'min_length': '密码最短6位'.
'max_length': '密码最多16位',
'required': '密码不能为空'
})
email =forms.EmailField(label='邮箱',
error_messages={
'invalid': '邮箱格式不正确'
}, required=False)

3.6 forms组件钩子函数

针对字段,通过钩子函数还可以做额外的校验

  • 局部钩子函数

    对单个字段进行额外的校验,使用局部钩子函数

class MyForm(forms.Form):
# .... def clean_username(self):
username = self.clean_data.get('username')
if '卧槽' in username:
# 给username字段添加错误信息
self.add_error('username': '小孩子不可以讲脏话哦')
return username
  • 全局钩子函数

    校验多个字段,使用全局钩子,例如

class MyForm(forms.Form):
# .... def clean(self):
password = self.clean_data.get('password')
re_password = self.clean_data.get('re_password')
if not password == re_password:
self.add_error('re_password', '两次密码不一致')
return self.clean_data

3.7 对字段进行正则校验

from django import forms
from django.core.validators import RegexValidator class MyForm(forms.Form):
# ....
phone = forms.CharField(
validators=[RegexValidator(r'^[0-9]+$', '请输入数字'),
Regexvalidator(r'^159[0-9]+$', '号码必须以159开头')]
)

3.8 改变input框的type属性值

# 改变input框type属性的方法
widget = widgets.TextInput() # 普通文本
widget = widgets.PaddwordInput() # 密码 # 让forms组件渲染出来的input框有form-control类属性
# 如果有多个类,用空格隔开
widget = widgets.TextInput(attrs={'class': 'form-control others'})
widget = widgets.PasswordInput(attrs={'class': 'form-control others'})

Dango之form校验组件的更多相关文章

  1. django之分页器、多对多关系、form校验组件

    批量插入数据 bulk_create # 1.往书籍表中插入数据 1000 # for i in range(1000): # 这种插入方式 效率极低 # models.Book.objects.cr ...

  2. Django中的分页操作、form校验工具

    批量插入数据 后端: def fenye(request): book_list=[] for i in range(100): book_list.append(models.Book(title= ...

  3. 利用jquery.validate以及bootstrap的tooltip开发气泡式的表单校验组件

    表单校验是页面开发中非常常见的一类需求,相信每个前端开发人员都有这方面的经验.网上有很多成熟的表单校验框架,虽然按照它们默认的设计,用起来没有多大的问题,但是在实际工作中,表单校验有可能有比较复杂的个 ...

  4. 《React后台管理系统实战 :一》:目录结构、引入antd、引入路由、写login页面、使用antd的form登录组件、form前台验证、高阶函数/组件

    实战 上接,笔记:https://blog.csdn.net/u010132177/article/details/104150177 https://gitee.com/pasaulis/react ...

  5. 98.Ext.form.Label组件的基本用法

    转自:https://www.cnblogs.com/kelly/archive/2009/06/05/1496897.html 本篇介绍Ext.form.Label组件的基本用法: 这里通过上一篇介 ...

  6. 【共享单车】—— React后台管理系统开发手记:AntD Form基础组件

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  7. 表单校验组件ValidForm

    10.1使用入门 1.引入css 请查看下载文件中的style.css,把里面Validform必须部分复制到你的css中 (文件里这个注释 "/*==========以下部分是Validf ...

  8. Vue2.0表单校验组件vee-validate的使用

    vee-validate使用教程 *本文适合有一定Vue2.0基础的同学参考,根据项目的实际情况来使用,关于Vue的使用不做多余解释.本人也是一边学习一边使用,如果错误之处敬请批评指出* 一.安装 n ...

  9. jQuery.validate 的form校验

    jQuery验证框架 : 基本html代码: <script src="js/jquery-1.9.1.js"></script> <script s ...

随机推荐

  1. Maven还停留在导jar包?快来探索Nexus私服的新世界

    写在前面 Maven,学习框架之前我们都会接触到的一个工具,感觉他的定位,似乎就跟git一样,只是方便我们开发?于是自然而然的,很多小猿对于Maven都只是停留在会用的阶段,利用他来构建,打包,引入j ...

  2. Git 极速上手(超简单)

    前言:本文主要介绍了一种快速入门使用Git的方法,通过四步完成本地仓库构建和推送到远程仓库(Github.Gitee码云),简单说明最常用的命令,不需要明白Git的原理即可使用,本文不介绍具体原理. ...

  3. Docker容器间网络互联原理,讲不明白算我输....

    @ 目录 一.今天我们要搞明白的实验 二.前置网络知识 2.1.docker默认为我们创建的网络 2.2.怎么理解docker0网桥 2.3.什么是veth-pair技术? 三.同一个局域网中不同主机 ...

  4. Tomcat 内存马(一)Listener型

    一.Tomcat介绍 Tomcat的主要功能 tomcat作为一个 Web 服务器,实现了两个非常核心的功能: Http 服务器功能:进行 Socket 通信(基于 TCP/IP),解析 HTTP 报 ...

  5. IDM使用教程:利用IDM下载百度网盘文件

    IDM是什么 其实我使用IDM下载器只是为了方便网页版百度网盘直接下载大于40M文件而已,大家知道文件过大必须打开客户端才能下载,这点对于我的破电脑感觉很烦躁,每次要等待它慢悠悠打开,然后动用我的超级 ...

  6. 【java+selenium3】自动化截图 (十四)

    一.截图 1. Firefox浏览器截图 FirefoxDriver firefoxDriver = new FirefoxDriver(); firefoxDriver.getScreenshotA ...

  7. MySQL基础学习——SQL对数据库进行操作、对数据库的表进行操作

    1.SQL对数据库进行操作: 创建数据库: 语法: create database 数据库名称 [character set 字符集 collate 字符集校对规则];字符集校对规则即所用字符集的数据 ...

  8. go条件语句

    1. if else package main import "fmt" func main(){ a :=123 if a>100{ fmt.prinln("大于 ...

  9. 暑假算法练习Day5

    咕咕了好几天哈哈哈哈,因为这几天在忙一些其他事(bushi ,好吧其实就是自己太懒啦,从今天开始继续每天的算法练习 1010 一元多项式求导 (25 分) 设计函数求一元多项式的导数.(注:\(x^n ...

  10. 问题 D: 某种序列

    题目描述 数列A满足An = An-1 + An-2 + An-3, n >= 3  编写程序,给定A0, A1 和 A2, 计算A99 输入 输入包含多行数据  每行数据包含3个整数A0, A ...