Python菜鸟之路:Django 表单验证
前言
Django中完成表单验证,常用的有两种方法:
一种是通过HTML + JS + Ajax实现。
另一种是通过Django自身的forms模块来生成相应个HTML标签来完成表单验证。这是本节着重讲的地方
第一种方法:html + ajax实现基本的login页面
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title></title>
- <style>
- .error-msg{
- color: red;
- }
- </style>
- </head>
- <body>
- <div>
- <div>
- <input type="text" name="user" />
- </div>
- <div>
- <input type="password" name="pwd" />
- </div>
- <div>
- <input type="text" name="num" />
- </div>
- <div>
- <input type="text" name="phone" />
- </div>
- <input type="button" value="提交" onclick="DoSubmit();" />
- </div>
- <script src="/static/jquery-2.1.4.min.js"></script>
- <script>
- function DoSubmit(){
- var input_dict = {};
- $('input').each(function(){
- var v = $(this).val();
- var n = $(this).attr('name');
- input_dict[n] = v;
- });
- console.log(input_dict);
- $('.error-msg').remove();
- $.ajax({
- url: '/login/',
- type: 'POST',
- data: input_dict,
- dataType: 'json',
- success: function (result) {
- if(result.status){
- location.href = '/index/';
- }else{
- $.each(result.message, function (k,v) {
- console.log(k,v[0].message);
- // <span class="error-msg">错误信息</span>
- var tag = document.createElement('span');
- tag.className = 'error-msg';
- tag.innerText = v[0].message;
- // input[name="user"]
- $('input[name="' + k + '"]').after(tag);
- })
- }
- },
- error: function () {
- }
- })
- }
- </script>
- </body>
- </html>
HTML代码
- from django.shortcuts import render,HttpResponse
- # Create your views here.
- from django import forms
- from django.core.exceptions import ValidationError
- import re
- 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('手机号码格式错误')
- class LoginForm(forms.Form):
- user = forms.CharField(required=True, error_messages={'required': '用户名不能为空.'})
- pwd = forms.CharField(required=True,
- min_length=6,
- max_length=10,
- error_messages={'required': '密码不能为空.', 'min_length': "至少6位"})
- num = forms.IntegerField(error_messages={'required': '数字不能空.','invalid': '必须输入数字'})
- phone = forms.CharField(validators=[mobile_validate, ],)
- import json
- def login(request):
- if request.method == 'POST':
- result = {'status': False, 'message': None}
- obj = LoginForm(request.POST)
- ret = obj.is_valid()
- if ret:
- print(obj.clean())
- result['status'] = True
- else:
- from django.forms.utils import ErrorDict
- #print(type(obj.errors),obj.errors.as_json())
- error_str = obj.errors.as_json()
- result['message'] = json.loads(error_str)
- return HttpResponse(json.dumps(result))
- return render(request, 'login.html')
views代码
这里边views中,已经用到了django自带的forms模块。在不用这个模块之前,我们对于用户输入进行判断,需要一堆的if..if...if语句来进行,但是用了这个模块之后,仅需要在定义好LoginForm类中每个字段的属性后,通过obj = LoginForm(request.POST)和ret = obj.is_valid()两步,就可以完成对于用户输入信息的验证。ret会返回验证是否全部通过。全部通过则为True,只要有一条表单信息验证不通过,则为False。
这里需要关注的知识点是:obj.clean() 是输出用户post的正确信息,是一个dict,obj.errors是输出用户post的错误信息,是一个通过ul li显示的信息,这样不方便查看。可以通过obj.errors.as_json()来将错误信息以json形式展示,用error_str = obj.errors.as_json() 和 result['message'] = json.loads(error_str)来完成错误信息收集。
另外定义表单验证规则LoginForm类时,字段名需要等于html中name值
补充知识点:在定义的LoginForm中,定义的pwd字段是这样定义的
- pwd = forms.CharField(required=True,
- min_length=6,
- max_length=10,
- error_messages={'required': '密码不能为空.', 'min_length': "至少6位"})
其中error_messages属性是用来定义错误信息的展示的。解释为:如果required验证不通过,则提示'密码不能为空',min_length验证不通过,则错误信息为'至少6位'。扩展'invalid': '必须输入数字'
第二种方法:利用forms模块生成html标签
forms能解决的2个问题:
问题1: 如果使用html自带的form标签来进行提交,如果提交的数据有错误,会清空表单中的全部数据,如果表单项较多,对用户非常不友好。那么forms模块就能解决这个问题。
问题2: 使用html的form标签提交数据,需要input标签的name属性必须和定义的class类的属性一致。而使用django forms模块,则不需要考虑这个问题。
废话不多说,直接贴代码
前端代码
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title></title>
- <style>
- .error-msg{
- color: red;
- }
- </style>
- </head>
- <body>
- <form action="/login/" method="POST">
- <div>
- <div>
- {{ obj1.user }}
- {% if obj1.errors.user %}
- <span class="error-msg">{{ obj1.errors.user.0 }}</span>
- {% endif %}
- </div>
- <div>
- {{ obj1.pwd }}
- <span class="error-msg">{{ obj1.errors.pwd.0 }}</span>
- </div>
- <div>
- {{ obj1.num }}
- <span class="error-msg">{{ obj1.errors.num.0 }}</span>
- </div>
- <div>
- {{ obj1.phone }}
- <span class="error-msg">{{ obj1.errors.phone.0 }}</span>
- </div>
- <div>
- {{ obj1.test }}
- <span class="error-msg">{{ obj1.errors.test.0 }}</span>
- </div>
- <input type="submit" value="提交" />
- </div>
- </form>
- </body>
- </html>
login.html
后端代码
- from django.shortcuts import render,HttpResponse,redirect
- # Create your views here.
- from django import forms
- from django.core.exceptions import ValidationError
- import re
- 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('手机号码格式错误')
- class LoginForm(forms.Form):
- user = forms.CharField(required=True, error_messages={'required': '用户名不能为空.'})
- pwd = forms.CharField(required=True,
- min_length=6,
- max_length=10,
- error_messages={'required': '密码不能为空.', 'min_length': "至少6位"})
- num = forms.IntegerField(error_messages={'required': '数字不能空.','invalid': '必须输入数字'})
- phone = forms.CharField(validators=[mobile_validate, ],)
- #test = forms.CharField(widget=forms.Textarea(attrs={'class': 'c1'}))
- test_choices = (
- (0, '上海'),
- (1, '背景'),
- )
- test = forms.IntegerField(widget=forms.Select(choices=test_choices))
- def login(request):
- if request.POST:
- objPost = LoginForm(request.POST)
- ret = objPost.is_valid()
- if ret:
- print(objPost.clean())
- else:
- from django.forms.utils import ErrorDict
- #print(type(obj.errors),obj.errors.as_json())
- # obj1.errors
- pass
- return render(request, 'login.html',{'obj1': objPost})
- else:
- objGet = LoginForm()
- return render(request, 'login.html',{'obj1': objGet})
views.py
- from django.conf.urls import url
- from app01 import views
- urlpatterns = [
- url(r'^login/', views.login),
- ]
urls.py
知识点:如何生成自定义的标签类型
forms默认帮我们生成的是INPUT标签,同时也支持生成其他标签。在源代码中,可以看到支持很多的Field类型
上边的一堆类可以看出,继承Field的类,可以用作生成标签,这些类都写在fields.py文件中。而forms.IntegerField(widget=forms.Select(choices=test_choices)中的widget字段中的类,都需要继承自Widget才可以,这些类都写在widgets.py中。
比如,如果生成下拉框可以这么写:
- test_choices = (
- (0, '上海'),
- (1, '背景'),
- )
- test = forms.IntegerField(widget=forms.Select(choices=test_choices))
知识点:如何给生成的标签自定义属性
- test = forms.CharField(widget=forms.Textarea(attrs={'class': 'c1'}))
Python菜鸟之路:Django 表单验证的更多相关文章
- django 表单验证和字段验证
表单验证和字段验证 表单验证发生在数据验证之后.如果你需要自定义这个过程,有几个不同的地方可以修改,每个地方的目的不一样.表单处理过程中要运行三种类别的验证方法.它们通常在你调用表单的is_valid ...
- 17.Django表单验证
Django提供了3中方式来验证表单 官网文档:https://docs.djangoproject.com/en/1.9/ref/validators 1.表单字段验证器 a.引入:from dja ...
- django表单验证和跨站伪造csrf
Form验证 django中的Form一般有两种功能: 输入html 验证用户输入 django使用内置form方法验证表单提交的数据 html页面 <!DOCTYPE html> < ...
- Django表单验证
从前端提交的各种数据可能存缺少必要字段以及包含非法数据等问题, 并且通常需要进行类型转换后才可以交由业务逻辑处理. 我们当然可以在控制器(Django的views函数)中完成这些工作, 但是这样会使控 ...
- Python自动化之ajax返回表单验证的错误信息和序列化扩展
form内置序列化错误 如果使用form提交数据的时候,可以直接返回错误信息到模板里面进行渲染 但是如果使用ajax处理呢 from django import forms from django.f ...
- Vue小白练级之路---001表单验证功能的一般实现思路
思路: 先各自验证 非空校验 具体规则校验 后兜底校验( 防止用户没输入信息直接登录 ) 实现:( 以 element-ui 为例 ) 在 标签上用 model 动态绑定收集数据的对象(form) 在 ...
- python_way day19 HTML-day5 (form表单验证,CSRF,cookie,session,缓存)
python-way day19 1. dJango的form表单验证 2.CSRF 跨站请求伪造 3.cookie,session 4.缓存 一,django表单验证功能 1.django验证基础: ...
- python运维开发(十九)----Django后台表单验证、session、cookie、model操作
内容目录: Django后台表单验证 CSRF加密传输 session.cookie model数据库操作 Django后台Form表单验证 Django中Form一般有2种功能: 1.用于做用户提交 ...
- 第二十二章 Django会话与表单验证
第二十二章 Django会话与表单验证 第一课 模板回顾 1.基本操作 def func(req): return render(req,'index.html',{'val':[1,2,3...]} ...
随机推荐
- 【Excle】文本日期转化为日期格式
现存在一列文本格式的日期 需要将该列转化为日期格式 方法一:使用分列 数据→分列,第三步选择[日期] 方法二:使用text函数 公式得到的结果为: 但是这样转化后的是文本型日期,需要转化为日期型得先转 ...
- Datastage装载数据报错 -798 428C9 不能把一个值插入到用GENERATED ALWAYS定义的ROWID列
使用Datastage装载数据到下表中报错. 表结构 INCREMENT ),cst_name )) 报错 解决办法 新建表T_tmp )) 导入到该表后再使用INSERT INTO ...SELEC ...
- 树莓派之OLED12864视频播放—BadApple
代码地址如下:http://www.demodashi.com/demo/13218.html 概述 本篇教程讲述了使用树莓派驱动OLED12864液晶屏,并在液晶屏上播放动画和视频. 硬件平台 树莓 ...
- C语言-Makefile经典教程(掌握这些足够)
makefile很重要 什么是makefile? 或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional 的 ...
- linux phpredisAdmin安装步骤
1:linux安装apache环境, 这一步可以不用安装plsql http://www.cnblogs.com/lufangtao/archive/2012/12/30/2839679.html 2 ...
- asp.net+mvc+easyui+sqlite 简单用户系统学习之旅(七)—— 添加用户到数据库-obj转json
这一节讲一下如何添加用户名和密码到已建的sqlite.db数据库中. 当在datagrid的toolbar中输入用户名.密码,然后点击添加按钮时,将该用户加入数据库,并显示出来.datagrid表格里 ...
- docker发布spring cloud应用
原文地址:http://www.cnblogs.com/skyblog/p/5163691.html 本文涉及到的项目: cloud-simple-docker:一个简单的spring boot应用 ...
- 分别在.NET Framework 与 .NET Core 框架下 编写Windows Service(windows服务程序)
前言,为什么会分别在两个框架下编写Windows Service,是因为最近在做区块链这块,使用的是NEO(小蚁区块链)的相关技术,NEO使用的是.net core 2.1,业务上需要写两个程序,一个 ...
- src和href使用总结
src img 图片 <img src="/img/1.png" alt="1" /> rame iframe 框架集 <iframe src ...
- atitit.TokenService token服务模块的设计
atitit.TokenService token服务模块的设计 1. Token的归类1 2. Token的用途2 2.1. 访问控制2 2.2. 编译原理术语)编辑2 2.3. 数据处理2 1. ...