概述

django框架提供了一个forms类,来处理web开发中的表单相关事项。众所周知,form最常做的是对用户输入的内容进行验证,为此django的forms类提供了全面的内容验证支持。

验证过程

流程详解

  1. 函数full_clean()依次调用每个field的clean()函数,该函数针对field的max_length,unique等约束进行验证,如果验证成功则返回值,否则抛出ValidationError错误。如果有值返回,则放入form的cleaned_data字典中。
  2. 如果每个field的内置clean()函数没有抛出ValidationError错误,则调用以clean_开头,以field名字结尾的自定义field验证函数。验证成功和失败的处理方式同步骤1。
  3. 最后,调用form的clean()函数——注意,这里是form的clean(),而不是field的clean()——如果clean没有错误,那么它将返回cleaned_data字典。
  4. 如果到这一步没有ValidationError抛出,那么cleaned_data字典就填满了有效数据。否则cleaned_data不存在,form的另外一个字典errors填上验证错误。在template中,每个field获取自己错误的方式是:{{ form.username.errors }}。
  5. 最后,如果有错误is_valid()返回False,否则返回True。

注意一点:自定义验证机制时:clean()和clean_&()的最后必须返回验证完毕或修改后的值.

form验证中自定义验证机制

需求

  1. 用户输入的是否为cc,如果是,提示用户
  2. 验证二次输入的密码是否匹配,如果不一致,提示用户

看下views.py中的代码:

  1. ...
  2. from django import forms
  3. from django.core.exceptions import ValidationError
  4. import re
  5. def mobile_validate(value):
  6. mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
  7. if not mobile_re.match(value):
  8. raise ValidationError('手机号码格式错误')
  9. class LoginForm(forms.Form):
  10. user = forms.CharField(required=True, error_messages={'required': '用户名不能为空.'})
  11. pwd = forms.CharField(required=True,
  12. min_length=6,
  13. max_length=10,
  14. error_messages={'required': '密码不能为空.', 'min_length': "至少6位"})
  15. pwd2 = forms.CharField(required=True,
  16. min_length=6,
  17. max_length=10,
  18. error_messages={'required': '密码不能为空.', 'min_length': "至少6位"})
  19. num = forms.IntegerField(error_messages={'required': '数字不能空.', 'invalid': '必须输入数字'})
  20. phone = forms.CharField(validators=[mobile_validate, ], )
  21. def clean_user(self):
  22. user = self.cleaned_data.get('user')
  23. if user == 'cc':
  24. raise forms.ValidationError('用户名是我的!')
  25. return user
  26. def clean(self):
  27. cleaned_data = self.cleaned_data
  28. pwd = cleaned_data['pwd']
  29. pwd2 = cleaned_data['pwd2']
  30. print(pwd,pwd2)
  31. if pwd != pwd2:
  32. raise forms.ValidationError('二次输入密码不匹配')
  33. return cleaned_data #注意此处一定要return clean_data,否则会报错
  34. def login(request):
  35. if request.POST:
  36. objPost = LoginForm(request.POST)
  37. ret = objPost.is_valid()
  38. if ret:
  39. print(objPost.clean())
  40. else:
  41. from django.forms.utils import ErrorDict
  42. print(objPost.non_field_errors())
  43. pass
  44. return render(request, 'login.html', {'obj1': objPost})
  45. else:
  46. objGet = LoginForm()
  47. return render(request, 'login.html', {'obj1': objGet})
  48. ...

HTML 页面中,如果想取clean()报错的信息,因其本身是一个迭代器,所以我们可以循环返回数据的non_field_errors取值,比如:

  1. <div>
  2. {% if obj1.non_field_errors %}
  3. {% for item in obj1.non_field_errors %}
  4. <span class="error_msg">{{ item }}</span>
  5. {% endfor %}
  6. {% endif %}

我来看下html中的设置:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. .error_msg{
  8. color: red;
  9. }
  10. </style>
  11. </head>
  12. <body>
  13. <form action="/login/" method="POST">
  14. <div>用户名:
  15. {{ obj1.user }}
  16. {% if obj1.errors.user %}
  17. <span class="error_msg">{{ obj1.errors.user.0 }}</span>
  18. {% endif %}
  19. </div>
  20. <div>密码:
  21. {{ obj1.pwd }}
  22. {% if obj1.errors.pwd %}
  23. <span class="error_msg">{{ obj1.errors.pwd.0 }}</span>
  24. {% endif %}
  25. </div>
  26. <div>确认密码:
  27. {{ obj1.pwd2 }}
  28. {% if obj1.errors.pwd2 %}
  29. <span class="error_msg">{{ obj1.errors.pwd2.0 }}</span>
  30. {% endif %}
  31. </div>
  32. <div>数字:
  33. {{ obj1.num }}
  34. {% if obj1.errors.num %}
  35. <span class="error_msg">{{ obj1.errors.num.0 }}</span>
  36. {% endif %}
  37. </div>
  38. <div>电话:
  39. {{ obj1.phone }}
  40. {% if obj1.errors.phone %}
  41. <span class="error_msg">{{ obj1.errors.phone.0 }}</span>
  42. {% endif %}
  43. </div>
  44. <div>
  45. {% if obj1.non_field_errors %}
  46. {% for item in obj1.non_field_errors %}
  47. <span class="error_msg">{{ item }}</span>
  48. {% endfor %}
  49. {% endif %}
  50. </div>
  51. <input type="submit" value="提交"/>
  52. </form>
  53. </body>
  54. </html>

Django之form表单验证顺序的更多相关文章

  1. django之form表单验证

    django中的Form一般有两种功能: 输入html 验证用户输入 #!/usr/bin/env python # -*- coding:utf- -*- import re from django ...

  2. Day19 Django之Form表单验证、CSRF、Cookie、Session和Model操作

    一.Form表单验证 用于做用户提交数据的验证1.自定义规则 a.自定义规则(类,字段名==html中的name值)b.数据提交-规则进行匹配代码如下: """day19 ...

  3. web框架-(六)Django补充---form表单验证

    一.form表单验证 1. 常规html页面的form表单验证 常规页面中,如果想实现对表单中用户输入信息的数据验证,需要配合Ajax来实现. 使用前我们先来熟悉下函数参数:request,其中包含的 ...

  4. Django的Form表单验证

    Form(from django import forms) 简短理解:后端提供了一个类:from django import forms,继承此类定义子类.子类中定义和form表单中提交到name名 ...

  5. Django中的Form表单验证

    回忆一下Form表单验证的逻辑: 前端有若干个input输入框,将用户输入内容,以字典传递给后端. 后端预先存在一个Form表单验证的基类,封装了一个检测用户输入是否全部通过的方法.该方法会先定义好错 ...

  6. python_way day19 HTML-day5 (form表单验证,CSRF,cookie,session,缓存)

    python-way day19 1. dJango的form表单验证 2.CSRF 跨站请求伪造 3.cookie,session 4.缓存 一,django表单验证功能 1.django验证基础: ...

  7. 6.4-6.5 使用form表单验证,完善登录页面

    之前是使用自定义的类来实现登录逻辑,现在使用django内置的form表单验证,用继承django的view来实现登录页面. users > views.py 的内容是: from django ...

  8. django form表单验证

    一. django form表单验证引入 有时时候我们需要使用get,post,put等方式在前台HTML页面提交一些数据到后台处理例 ; <!DOCTYPE html> <html ...

  9. 第三百一十一节,Django框架,Form表单验证

    第三百一十一节,Django框架,Form表单验证 表单提交 html <!DOCTYPE html> <html lang="en"> <head& ...

随机推荐

  1. 大数据之路week06--day03(jdk8新特性 Lambda表达式)

    为什么使用Lambda表达式?(做为初学者接触这个新的语法,会很懵逼,说道理,我在接触到这一块的时候,语法规则我看到了也很懵逼,因为这个和逻辑的关系不是很大,但就是作为一种新的语法出现,一时间很难接受 ...

  2. 《奋斗吧!菜鸟》 第七次作业:团队项目设计完善&编码

    项目 内容 这个作业属于哪个课程 任课教师链接 作业要求 https://www.cnblogs.com/nwnu-daizh/p/10980707.html 团队名称 奋斗吧!菜鸟 作业学习目标 团 ...

  3. 命令检测站点是否使用CDN加速

    在CMD   输入   nslookup    域名 例如:nslookup www.baidu.com有CDN的示例Server:  cache3-gzAddress:  211.98.4.1Non ...

  4. XAMPP启动Apache服务时启动失败

    9:48:49 [Apache] Apache Service detected with wrong path 9:48:49 [Apache] Change XAMPP Apache and Co ...

  5. 个人项目———Java实现WordCount

    2018年系统分析与设计—个人项目作业 题目来自于 :https://edu.cnblogs.com/campus/xnsy/2018Systemanalysisanddesign/homework/ ...

  6. SQL SERVER表变量和临时表

    一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯一约束,NULL约束和CHECK约束(外键约 ...

  7. xml介绍+xml创建+xml读取

    1.xml介绍:(URL:https://blog.csdn.net/weixin_37861326/article/details/81082144) xml是用来传输内容的,是w3c推荐的 2.使 ...

  8. 使用Keras训练神经网络备忘录

    小书匠深度学习 文章太长,放个目录: 1.优化函数的选择 2.损失函数的选择 2.2常用的损失函数 2.2自定义函数 2.1实践 2.2将损失函数自定义为网络层 3.模型的保存 3.1同时保持结构和权 ...

  9. tesonflow实现word2Vec

    word2Vec 是实现从原始语料中学习字词空间向量的预测模型 使用word2Vec的skip_Gram模型 import collections import math import os impo ...

  10. QoS in RoCE

    QoS in RoCE 首页分类标签留言关于订阅2018-03-22 | 分类 Network  | 标签 RDMA  RoCE  ECN  PFC Overview TCP/IP协议栈满足不了现代I ...