Django--Forms组件使用

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或者falseif post_forms():register = post_forms.cleaned_dataprint(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_dataelse:raise ValidationError('两次密码不一致')

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

543387-20190620132320954-2085309689.gif

转载于:https://www.cnblogs.com/zj901203/p/11057612.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

yii2关联表

asArray()这个方法很好用&#xff0c;返回数组是1版本想要的形式&#xff0c;这种方式有种tp框架的感觉转载于:https://www.cnblogs.com/peipeiyu/p/10974487.html

详细程序注解学OpenCL一 环境配置和入门程序

本专栏是通过注解程序的方法学习OpenCL&#xff0c;我觉得一个一个地去抠原理也不是办法&#xff0c;干脆直接学习程序&#xff0c;然后把相关原理都直接注解到程序语句当中。 原创地址&#xff1a;http://blog.csdn.net/kenden23/article/details/14101657 一开始要配置好环境…

解决 IDEA 在 commit 代码时 git 日志乱码 (提交时填写的中文说明乱码)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.问题描述&#xff1a; idea 开发代码中的 中文正常&#xff0c;但提交到码云时填写的提交日志是乱码。 提交到码云后是这样的&#…

神奇的pdfkit工具——将字符串保存为pdf文件

神奇的pdfkit工具——将字符串保存为pdf文件 1、安装工具包 pip install pdfkit 2、上干货 import pdfkitdef create_pdf(str_data, to_file):将字符串生成pdf文件 # &#xff08;需下载wkhtmltox&#xff09;将程序路径传入config对象config pdfkit.configuration(wkhtmltopd…

OpenCL结构

原标题&#xff1a;从零开始学习OpenCL开发&#xff08;一&#xff09;架构 1 异构计算、GPGPU与OpenCL OpenCL是当前一个通用的由很多公司和组织共同发起的多CPU\GPU\其他芯片 异构计算&#xff08;heterogeneous&#xff09;的标准&#xff0c;它是跨平台的。旨在充分利用GP…

docker-compose 使用小例

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 只是一个很简单的小例。 1. 原本有的容器 2. docker-compose.yml 写法&#xff1a; gentle 处可以任意写&#xff0c;gentle 是我的项…

AMD GPU+VS2010的OpenCL配置

安装开发环境可以参照DE4-530的OpenCL开发环境搭建&#xff08;最终版&#xff09;&#xff0c;这篇文章的大部分内容转载自&#xff1a;http://www.verydemo.com/demo_c92_i226325.html AMD的Heterogeneous Computing有很多AMD的OpenCL资料&#xff0c;包括各种分析工具&#…

ABP开发框架前后端开发系列---(9)ABP框架的权限控制管理

在前面两篇随笔《ABP开发框架前后端开发系列---&#xff08;7&#xff09;系统审计日志和登录日志的管理》和《ABP开发框架前后端开发系列---&#xff08;8&#xff09;ABP框架之Winform界面的开发过程》开始介绍了权限管理的内容&#xff0c;其中只是列出了内部的权限系统的审…

GIL , 线程池 , 同步 , 异步 , 队列 , 事件

一.什么是GIL 官方解释:In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (Howev…

在Windows下使用OpenCL配置

前言 目前&#xff0c;NVIDIA 和 AMD 的 Windows driver 均有支持OpenCL&#xff08;NVIDIA 的正式版 driver 是从自195.62 版开始&#xff0c;而 AMD则是从9.11 版开始&#xff09;。NVIDIA 的正式版 driver 中包含 OpenCL.dll&#xff0c;因此可以直接使用。AMD 到目前为止…

CVE-2019-0708 BlueKeep的扫描和打补丁

2019独角兽企业重金招聘Python工程师标准>>> 简介 CVE-2019-0708 BlueKeep是一个Windows远程桌面服务的远程代码执行漏洞&#xff0c;其危害程度不亚于CVE-2017-0143 EternalBlue&#xff0c;该漏洞影响了某些旧版本的Windows系统。此漏洞是预身份验证&#xff0c;无…

《OpenCL异构计算》新版中译本派送中!

《OpenCL异构计算1.2》新鲜出炉&#xff0c;目前市面上仍一书难求&#xff01;我们已向清华出版社订购到第一批新书。关注异构开发社区&#xff0c;积极参与&#xff0c;就有可能免费获取新书&#xff01; 1.如果您异构社区的老朋友&#xff0c;请关注&#xff1a;10.1假期后我…

查看、关闭当前服务器上启动服务 / 进程

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 我用 java -jar 的方式启动了一个服务&#xff0c;然后要关闭这个服务 / 进程。 1. ps -aux 查看当前进程&#xff0c;整个列表最 后一…

Booster 系列之——多线程优化

项目地址&#xff1a;github.com/didi/booste… 对于开发者来说&#xff0c;线程管理一直是最头疼的问题之一&#xff0c;尤其是业务复杂的 APP&#xff0c;每个业务模块都有着几十甚至上百个线程&#xff0c;而且&#xff0c;作为业务方&#xff0c;都希望本业务的线程优先级最…

dubbo的底层原理

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、Duboo基本概念解释 Dubbo是一种分布式服务框架。 Webservice也是一种服务框架&#xff0c;但是webservice并不是分布式的服务框架&…

nginx+php+mysql+haproxy+keepalived+NFS,搭建wordpress

实现LNMP 实现环境&#xff1a; 服务版本系统CentOS7.6Mysql5.6.34Nginx1.14.2PHP7.1.30HAProxy1.8.20Keepalived1.3.5NFS1.3.0主机IPMysql_master192.168.37.108Mysql_slave192.168.37.105NginxPHP192.168.37.103NginxPHP192.168.37.104HAProxyKeepalived192.168.37.101HAPro…

Java8函数式编程

最近使用lambda表达式&#xff0c;感觉使用起来非常舒服&#xff0c;箭头函数极大增强了代码的表达能力。于是决心花点时间深入地去研究一下java8的函数式。 一、lambda表达式 先po一个最经典的例子——线程 public static void main(String[] args) {// Java7new Thread(new R…

IntelliJ IDEA 配置JDK

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 IDEA配置JDK 1、点击File -->Project Structure&#xff1b; 2、点击左侧标签页SDKs选项&#xff0c;再点击左上角“”&#xff0c;…

get和post 两种基本请求方式的区别

GET和POST是HTTP请求的两种基本方法&#xff0c;要说它们的区别&#xff0c;接触过WEB开发的人都能说出一二。 最直观的区别就是GET把参数包含在URL中&#xff0c;POST通过request body传递参数。 你可能自己写过无数个GET和POST请求&#xff0c;或者已经看过很多权威网站总结出…

Java异常处理001:Maven clean package时Failed to clean project: Failed to delete

Java异常处理001&#xff1a;Maven打包时Failed to clean project: Failed to delete 异常日志&#xff1a; [ERROR] Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.6.1:clean (default-clean) on project fmk-web: Failed to clean project: Failed …