校验字段功能

针对一个实例:用户注册。

模型:models.py

  1. class UserInfo(models.Model):
  2. name=models.CharField(max_length=32)
  3. pwd=models.CharField(max_length=32)
  4. email=models.EmailField()
  5. tel=models.CharField(max_length=32)

模板: reg.html:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6.  
  7. </head>
  8. <body>
  9.  
  10. <form action="" method="post">
  11. {% csrf_token %}  # 为了通过中间件检验
  12. <div>
  13. <label for="user">用户名</label>
  14. <p><input type="text" name="name" id="name"></p>
  15. </div>
  16. <div>
  17. <label for="pwd">密码</label>
  18. <p><input type="password" name="pwd" id="pwd"></p>
  19. </div>
  20. <div>
  21. <label for="r_pwd">确认密码</label>
  22. <p><input type="password" name="r_pwd" id="r_pwd"></p>
  23. </div>
  24. <div>
  25. <label for="email">邮箱</label>
  26. <p><input type="text" name="email" id="email"></p>
  27. </div>
  28. <input type="submit">
  29. </form>
  30.  
  31. </body>
  32. </html>

视图函数:reg

  1. # forms组件
  2. from django.forms import widgets
  3.  
  4. wid_01=widgets.TextInput(attrs={"class":"form-control"})
  5. wid_02=widgets.PasswordInput(attrs={"class":"form-control"})
  6.  
  7. class UserForm(forms.Form):
  8. name=forms.CharField(max_length=32,
  9. widget=wid_01
  10. )
  11. pwd=forms.CharField(max_length=32,widget=wid_02)
  12. r_pwd=forms.CharField(max_length=32,widget=wid_02)
  13. email=forms.EmailField(widget=wid_01)
  14. tel=forms.CharField(max_length=32,widget=wid_01)
  15.  
  16. def register(request):
  17.  
  18. if request.method=="POST":
  19. form=UserForm(request.POST)  # 生成校验对象,接受客户端传过来的值,进行校验
  20. if form.is_valid():  # 返回布尔值,校验的最后结果
  21. print(form.cleaned_data) # 所有通过校验的字段以及对应的值
  22. else:
  23. print(form.cleaned_data) #
  24. print(form.errors) # ErrorDict : {"校验错误的字段":["错误信息",]}
  25. print(form.errors.get("name")) # ErrorList ["错误信息",]
  26. return HttpResponse("OK")
  27.  
  28. return render(request,"register.html",locals())

重要的点:

模板传过来的字段要和类的字段一一对应。

可以多,不能少。

如果有没有的值,即多了不存在字段,不会报错,不care没有的键值对。但是,若少了必然会是False

默认都有非空规则,如果需要的匹配的值,有找不到的,就会是False。

如果全部正确,才是True

如果有错误的,正确的放在form.cleaned_data,错误的放在forms.errors ,错误的信息作为值

forms.error.get(“xxx”)[0]取出错误信息,因为其本质的类型是一个字典

form.is_valid() :返回布尔值
form.cleaned_data :{"name":"yuan","email":"123@qq.com"}
form.errors :{"name":[".........."]}

渲染标签功能

为了更方便和快捷,以及防止输入出错,我么可以使用标签渲染

方式一

form=UserForm

{{form.字段名.lable }}

{{form.字段名 }}

需要在Form类中设置lable属性,显示别名(中文名)

view.py中

  1. class UserForm(forms.Form):
  2. name=forms.CharField(min_length=4,label='用户名')
  3. pwd=forms.CharField(min_length=4,label='密码')
  4. pwd_r=forms.CharField(min_length=4,label='确认密码')
  5. tel=forms.CharField(label='手机号')
  6. email=forms.EmailField(label='邮箱')

reg.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
  7. <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
  8. </head>
  9. <body>
  10. <h3>注册页面</h3>
  11. <div class="container">
  12. <div class="row">
  13. <div class="col-md-6 col-lg-offset-3">
  14.  
  15. <form action="" method="post">
  16. {% csrf_token %}
  17. <div>
  18. <label for="">用户名</label>
  19. {{ form.name }}
  20. </div>
  21. <div>
  22. <label for="">密码</label>
  23. {{ form.pwd }}
  24. </div>
  25. <div>
  26. <label for="">确认密码</label>
  27. {{ form.r_pwd }}
  28. </div>
  29. <div>
  30. <label for=""> 邮箱</label>
  31. {{ form.email }}
  32. </div>
  33.  
  34. <input type="submit" class="btn btn-default pull-right">
  35. </form>
  36. </div>
  37. </div>
  38. </div>
  39.  
  40. </body>
  41. </html>

方式二

用for循环动态添加

  1. <form action="" method="post">
  2. {% csrf_token %}
  3.  
  4. {% for field in form %}
  5. <div>
  6. <label for="">{{ field.label }}</label>
  7. {{ field }}
  8. </div>
  9. {% endfor %}
  10. <input type="submit" class="btn btn-default pull-right">
  11.  
  12. </form>

方式三

{{form.as_p }},{{ forms.as_table }},….有很多种

固定了样式,而且不易于操作,所以不建议使用

  1. <form action="" method="post">
  2. {% csrf_token %}
  3.  
  4. {{ form.as_p }}
  5. <input type="submit" class="btn btn-default pull-right">
  6.  
  7. </form>

显示错误与重置输入信息功能

views.py

  1. from django.shortcuts import render
  2.  
  3. # Create your views here.
  4. from app01.models import *
  5. from django import forms
  6. from django.forms import widgets # 设置调整渲染的样式的模块
  7.  
  8. # 创建forms组件,用来校验输入
  9. class UserForm(forms.Form):
  10. name=forms.CharField(min_length=4, # 校验长度
  11. label='用户名', # 设置别名
  12. error_messages={"required":'该字段不能为空'}, # 错误信息提示更改为中文
  13. widget=widgets.TextInput(attrs={'class':'form-control'})) # 添加class类的样式
  14. pwd=forms.CharField(min_length=4,label='密码',
  15. widget=widgets.PasswordInput(attrs={'class':'form-control'}), # 设置成password类型,并添加样式
  16. error_messages = {"required": '该字段不能为空'}
  17. )
  18. pwd_r=forms.CharField(min_length=4,label='确认密码',
  19. error_messages={"required":'该字段不能为空'},
  20. widget=widgets.TextInput(attrs={'class':'form-control'})
  21. )
  22. tel=forms.CharField(label='手机号',
  23. error_messages={"required":'该字段不能为空','invalid':'格式错误'},
  24. widget=widgets.TextInput(attrs={'class':'form-control'})
  25. )
  26. email=forms.EmailField(label='邮箱',
  27.  
  28. error_messages={"required":'该字段不能为空','invalid':'格式错误'},
  29. widget=widgets.TextInput(attrs={'class':'form-control'})
  30. )
  31.  
  32. def reg(request):
  33. if request.method=="POST":
  34. forms=UserForm(request.POST)
  35. print('post')
  36. if forms.is_valid():
  37. print(forms.cleaned_data)
  38. else:
  39. print(forms.is_valid())
  40. print(forms.cleaned_data)
  41. print(forms.errors)
  42. # 重要的一步放在这里,同时保留了传过来的值,所以前端在刷新的时候,之前的输入还会存在
  43. return render(request,'reg.html',locals())
  44.  
  45. forms=UserForm()
  46.  
  47. return render(request,'reg.html',locals())

模板reg.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"
  7. integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
  8. </head>
  9. <body>
  10. <h3>渲染方式一</h3>
  11. <form action="" method="post" novalidate>
  12. {% csrf_token %}
  13. <p>
  14. {{ forms.name.label }}{{ forms.name }}
  15. <span>{{ forms.name.errors.0 }}</span>
  16. </p>
  17. <p>
  18. {{ forms.pwd.label }}{{ forms.pwd }}
  19. <span>{{ forms.pwd.errors.0 }}</span> {#.0很重要 取到第一个错误,errors得到的是一个li标签列表#}
  20. </p>
  21. <p>
  22. {{ forms.pwd_r.label }}{{ forms.pwd_r }}
  23. <span>{{ forms.pwd_r.errors.0 }}</span> {#.0很重要#}
  24. </p>
  25. <p>
  26. {{ forms.tel.label }}{{ forms.tel }}
  27. <span>{{ forms.tel.errors.0 }}</span> {#.0很重要#}
  28. </p>
  29. <p>
  30. {{ forms.email.label }}{{ forms.email }}
  31. <span>{{ forms.email.errors.0 }}</span> {#.0很重要#}
  32. </p>
  33. <input type="submit">
  34. </form>
  35. </body>
  36. </html>

局部钩子与全局钩子

模板文件reg.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style>
  7. .error{
  8. color: red;
  9. }
  10. </style>
  11. <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
  12. <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"
  13. integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
  14. </head>
  15. <body>
  16.  
  17. <div class="container">
  18.  
  19. <div class="row">
  20. <div class="col-md-6 col-lg-offset-3">
  21. <hr>
  22. <h3>forms组件渲染方式1</h3>
  23. <form action="" method="post" novalidate>
  24. {% csrf_token %}
  25. <p>{{ form.name.label }}
  26. {{ form.name }} <span class="pull-right error">{{ form.name.errors.0 }}</span>
  27. </p>
  28. <p>{{ form.pwd.label }}
  29. {{ form.pwd }} <span class="pull-right error">{{ form.pwd.errors.0 }}</span>
  30. </p>
  31. <p>确认密码
  32. {{ form.r_pwd }} <span class="pull-right error">{{ form.r_pwd.errors.0 }}</span>
  1. <span class="pull-right error">{{ errors.0 }}</span>  {# 全局错误 #}
  2. </p>
  3. <p>邮箱 {{ form.email }} <span class="pull-right error">{{ form.email.errors.0 }}</span></p>
  4. <p>手机号 {{ form.tel }} <span class="pull-right error">{{ form.tel.errors.0 }}</span></p>
  5. <input type="submit">
  6.  
  7. </form>
  8. </div>
  9. </div>
  10. </div>
  11.  
  12. </body>
  13. </html>

视图函数views.py

  1. from django.shortcuts import render,HttpResponse
  2.  
  3. # Create your views here.
  4.  
  5. from app01.myforms import *
  6.  
  7. def reg(request):
  8.  
  9. if request.method=="POST":
  10.  
  11. print(request.POST)
  12.  
  13. #form=UserForm({"name":"yu","email":"123@qq.com","xxxx":"alex"})
  14.  
  15. form=UserForm(request.POST) # form表单的name属性值应该与forms组件字段名称一致
  16.  
  17. print(form.is_valid()) # 返回布尔值
  18.  
  19. if form.is_valid():
  20. print(form.cleaned_data) # {"name":"yuan","email":"123@qq.com"}
  21. else:
  22. print(form.cleaned_data) # {"email":123@qq.com}
  23.  
  24. # 全局钩子错误
  25. #print("error",form.errors.get("__all__")[0])
  26. errors=form.errors.get("__all__")
  27.  
  28. return render(request,"reg.html",locals())
  29.  
  30. form=UserForm()
  31.  
  32. return render(request,"reg.html",locals())

将forms组件逻辑,新建文件单独放置

  1. from django import forms
  2.  
  3. from django.forms import widgets
  4. from app01.models import UserInfo
  5.  
  6. from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
  7.  
  8. class UserForm(forms.Form):
  9. name=forms.CharField(min_length=4,label="用户名",error_messages={"required":"该字段不能为空"},
  10. widget=widgets.TextInput(attrs={"class":"form-control"})
  11. )
  12. pwd=forms.CharField(min_length=4,label="密码",
  13. widget=widgets.PasswordInput(attrs={"class":"form-control"})
  14. )
  15. r_pwd=forms.CharField(min_length=4,label="确认密码",error_messages={"required":"该字段不能为空"},widget=widgets.TextInput(attrs={"class":"form-control"}))
  16. email=forms.EmailField(label="邮箱",error_messages={"required":"该字段不能为空","invalid":"格式错误"},widget=widgets.TextInput(attrs={"class":"form-control"}))
  17. tel=forms.CharField(label="手机号",widget=widgets.TextInput(attrs={"class":"form-control"}))
  18.  
  19. def clean_name(self):  # 局部钩子
  20.  
  21. val=self.cleaned_data.get("name")
  22.  
  23. ret=UserInfo.objects.filter(name=val)
  24.  
  25. if not ret:
  26. return val
  27. else:
  28. raise ValidationError("该用户已注册!")
  29.  
  30. def clean_tel(self):  # 局部钩子
  31.  
  32. val=self.cleaned_data.get("tel")
  33.  
  34. if len(val)==11:
  35.  
  36. return val
  37. else:
  38. raise ValidationError("手机号格式错误")
  39.  
  40. def clean(self):  # 全局钩子
  41. pwd=self.cleaned_data.get('pwd')
  42. r_pwd=self.cleaned_data.get('r_pwd')
  43.  
  44. if pwd and r_pwd:
  45. if pwd==r_pwd:
  46. return self.cleaned_data
  47. else:
  48. raise ValidationError('两次密码不一致')
  49. else:
  50.  
  51. return self.cleaned_data

web框架开发-Django的Forms组件的更多相关文章

  1. web框架开发-Django用户认证组件

    可以用认证组件做什么 针对session的缺陷, 跟新数据时,不跟新key键, 用户认证组件是删除后再重建 用户认证组件很多功能可以直接使用 利用用户认证表(auth_user,通过Django自己创 ...

  2. web框架开发-Django简介

    MVC与MTV模型 MVC Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起,模型负责业务 ...

  3. web框架开发-Django组件cookie与session

    http协议的每一次都是无保存状态的请求,这会带来很多的不方便,比如,一刷新网页,或者进入该网页的其他页面,无法保存之前的登录状态.为了解决类似这样的问题,引入了会话跟踪 会话跟踪技术 1 什么是会话 ...

  4. web框架开发-Django模型层(1)之ORM简介和单表操作

    ORM简介 不需要使用pymysql的硬编码方式,在py文件中写sql语句,提供更简便,更上层的接口,数据迁移方便(有转换的引擎,方便迁移到不同的数据库平台)…(很多优点),缺点,因为多了转换环节,效 ...

  5. web框架开发-Django视图层

    视图函数 一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . ...

  6. web框架开发-Django模型层(2)-多表操作

    很重要,都是精华 多表关系模型 一对一 一旦确定表关系是一对一,在两张表中的任意一张表中建立关联字段+Unique 一对多 一旦确定表关系是一对多,创建关联字段在多的表中 多对多 一旦确定表关系是多对 ...

  7. Python开发【第二十二篇】:Web框架之Django【进阶】

    Python开发[第二十二篇]:Web框架之Django[进阶]   猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...

  8. Python开发【第二十一篇】:Web框架之Django【基础】

    Python开发[第二十一篇]:Web框架之Django[基础]   猛击这里:http://www.cnblogs.com/wupeiqi/articles/5237704.html Python之 ...

  9. Python开发【第十八篇】Web框架之Django【基础篇】

    一.简介 Python下有许多款不同的 Web 框架,Django 是重量级选手中最有代表性的一位,许多成功的网站和APP都基于 Django. Django 是一个开放源代码的Web应用框架,由 P ...

随机推荐

  1. oracle数据库之plsql可视化操作建表

    首先登录PL/SQL developer.   点击工具栏中的第一个图标,选择“表”.     右边会弹出一个窗口,我们以可视化方式来创建一个Table. 如下图所示,在“一般”选项卡中,输入“名称” ...

  2. Jexus~Linux环境下的部署

    Jexus 即 Jexus Web Server,简称JWS,是Linux平台上的一款ASP.NET WEB服务器,是 Linux.Unix.FreeBSD 等非Windows系统架设 ASP.NET ...

  3. PE知识复习之PE新增节

    PE知识复习之PE新增节 一丶为什么新增节.以及新增节的步骤 例如前几讲.我们的PE文件在空白区可以添加代码.但是这样是由一个弊端的.因为你的空白区节属性可能是只读的不能执行.如果你修改了属性.那么程 ...

  4. Spring源码情操陶冶#task:executor解析器

    承接Spring源码情操陶冶-自定义节点的解析.线程池是jdk的一个很重要的概念,在很多的场景都会应用到,多用于处理多任务的并发处理,此处借由spring整合jdk的cocurrent包的方式来进行深 ...

  5. Python2 编码问题分析

    本文浅显易懂,绿色纯天然,手工制作,请放心阅读. 编码问题是一个很大很杂的话题,要向彻底的讲明白可以写一本书了.导致乱码的原因很多,系统平台.编程语言.多国语言.软件程序支持.用户选择等都可能导致无法 ...

  6. 杭电ACM2012--素数判定

    素数判定 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  7. [Redis] redis的设计与实现-对象系统

    1.redis并没有直接使用前面的数据结构实现键值对数据库,而是基于数据结构创建了一个对象系统,字符串对象/列表对象/哈希对象/集合对象/有序集合对象都用到了至少一种前面的数据结构2.针对不同的使用场 ...

  8. (2)Maven快速入门_2maven在Eclipse中的设置

    1.1 eclipse Maven 设置      [Eclipse Mars之后的版本已经集成了Maven] 1.1.1 eclipse 设置  Maven 下载jar的源码 和 doc 文件  勾 ...

  9. javaweb中上传图片并显示图片,用我要上传课程信息(里面包括照片)这个例子说明

    原理:  从客户端上传到服务器                照片——文件夹——数据库 例如:桌面一张照片,在tomacat里创建upload文件夹,把桌面照片上传到upload文件夹里,并且把照片的 ...

  10. javascript进阶之AJAX

    AJAX 一 AJAX预备知识:json进阶 1.1 什么是JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON是用字符串来表示Javas ...