Form表单的功能

  • 自动生成HTML表单元素
  • 检查表单数据的合法性
  • 如果验证错误,重新显示表单(数据不会重置)
  • 数据类型转换(字符类型的数据转换成相应的Python类型)

Form相关的对象包括

  • Widget:用来渲染成HTML元素的工具,如:forms.Textarea对应HTML中的<textarea>标签
  • Field:Form对象中的一个字段,如:EmailField表示email字段,如果这个字段不是有效的email格式,就会产生错误。
  • Form:一系列Field对象的集合,负责验证和显示HTML元素
  • Form Media:用来渲染表单的CSS和JavaScript资源。

Form案例验证

前端:form表单

后台:创建form类,当请求到来时,先匹配,匹配出正确和错误信息。

案例一:

views.py

  1. #coding:utf8
  2. from django.shortcuts import render,HttpResponseRedirect
  3. from app02 import forms,models
  4.  
  5. # Create your views here.
  6. def form1(request):
  7. if request.method=="POST": #这里POST一定要大写
  8. #获取请求内容,做验证
  9. f = forms.UserMessage(request.POST) #request.POST:将接收到的数据通过forms.UserMessage验证
  10. if f.is_valid(): #验证请求的内容和forms.UserMessage里面的是否验证通过。通过是True,否则False。
  11. print(f.cleaned_data) #cleaned_data类型是字典,里面是提交成功后的信息
  12. else: #错误信息包含是否为空,或者符合正则表达式的规则
  13. print(type(f.errors),f.errors) #errors类型是ErrorDict,里面是ul,li标签
  14. return render(request,"app02/form1.html",{"error":f.errors})
  15. return render(request,"app02/form1.html")

form1.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>基础版</title>
  6. </head>
  7. <body>
  8. <!--{#{{ error }}接收后台返回的错误信息封装在ul,li标签里面:#} -->
  9. {{ error }}
  10. <form action="/app02/form1/" method="POST">
  11. <div>
  12. 用户名:<input type="text" name="username" />
  13. </div>
  14. <div>
  15. 密&nbsp;&nbsp;码:<input type="text" name="password" />
  16. </div>
  17. <div>
  18. <input type="submit" value="提交" />
  19. </div>
  20. </form>
  21. </body>
  22. </html>

forms.py

  1. #coding:UTF8
  2. from django import forms
  3. from app02 import models
  4. class UserMessage(forms.Form):
  5. UserName = forms.CharField(max_length=100,label='用户名')
  6. Password = forms.CharField(max_length=100,label='密码')

访问页面:

没有输入内容后提交,通过模板语言展示了错误信息

form验证时不用自定义错误信息就可以返回错误信息到前端以标签方式展现。

.is_valid():返回True或者False

.cleaned_data:通过验证后的数据

errors:
.error.get("user",None)error封装所有的错误信息,如果没有获取到,默认为None。

.error.get["pwd"]直接获取到ul、li。

如下:

(<class 'django.forms.utils.ErrorDict'>, {'UserName': [u'This field is required.'], 'Password': [u'This field is required.']})

案例二:

views.py

  1. #coding:utf8
  2. from django.shortcuts import render,HttpResponseRedirect
  3. from app02 import forms,models
  4.  
  5. def form2(request):
  6. if request.method == "POST":
  7. f = forms.UserMessage(request.POST)
  8. if f.is_valid():
  9. print(f.cleaned_data)
  10. else:
  11. return render(request,"app02/form2.html",{"error":f.errors,"form":f})
  12. else:
  13. # 如果不是post提交数据,就不传参数创建对象,并将对象返回给前台,直接生成input标签,内容为空
  14. f = forms.UserMessage()
  15. return render(request,"app02/form2.html",{"form":f})
  16. return render(request,"app02/form2.html")

form2.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>进阶版</title>
  6. <style>
  7. .input-group{
  8. position: relative;
  9. padding: 20px;
  10. width: 250px;
  11. }
  12. .input-group input{
  13. width: 200px;
  14. display: inline-block;
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <form action="/app02/form2/" method="POST">
  20. <div class="input-group">用户名:
  21. <!-- {#接收后台传过来的form对象,自动生成input标签#}-->
  22. {{ form.UserName }}
  23. <!-- {#从后台传过来的error是字典,直接{{ error.UserName.0 }}呈现错误信息#} -->
  24.        <!-- {#如果后台返回了错误信息,将错误信息放入span标签,在页面显示,否则不显示#}-->
  25. {% if error.UserName.0 %}
  26. <span>{{ error.UserName.0 }}</span>
  27. {% endif %}
  28. </div>
  29. <div class="input-group">密码:
  30. {{ form.Password }}
  31. {% if error.Password.0 %}
  32. <span>{{ error.Password.0 }}</span>
  33. {% endif %}
  34. </div>
  35. <div>
  36. <input type="submit" value="提交" />
  37. </div>
  38. </form>
  39. </body>
  40. </html>

forms.py

  1. #coding:UTF8
  2. from django import forms
  3. from app02 import models
  4. class UserMessage(forms.Form):
  5. UserName = forms.CharField(max_length=100,label='用户名')
  6. Password = forms.CharField(max_length=100,label='密码')

案例三:

models.py

  1. #coding:Utf8
  2. from __future__ import unicode_literals
  3.  
  4. from django.db import models
  5. from django import forms
  6.  
  7. # Create your models here.
  8. class Author(models.Model):
  9. #作者
  10. name = models.CharField(max_length=100)
  11. age = models.IntegerField()
  12.  
  13. class BookType(models.Model):
  14. #图书类型
  15. caption = models.CharField(max_length=64)
  16.  
  17. class Book(models.Model):
  18. #图书
  19. name = models.CharField(max_length=64)
  20. pages = models.IntegerField()
  21. price = models.DecimalField(max_digits=10,decimal_places=2)
  22. pubdate = models.DateField()
  23.  
  24. authors = models.ManyToManyField(Author)
  25. book_type = models.ForeignKey(BookType)

views.py

  1. #coding:utf8
  2. from django.shortcuts import render,HttpResponseRedirect
  3. from app02 import forms,models
  4.  
  5. def form3(request):
  6. if request.method == "POST":
  7. f = forms.Form3(request.POST)
  8. if f.is_valid():
  9. print(f.cleaned_data)
  10. else:
  11. return render(request,"app02/form3.html",{"error":f.errors,"form":f})
  12. else:
  13. # 如果不是post提交数据,就不传参数创建对象,并将对象返回给前台,直接生成input标签,内容为空
  14. f = forms.Form3()
  15. return render(request,"app02/form3.html",{"form":f})
  16. return render(request,"app02/form3.html")

form3.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <style>
  6. .input-group{
  7. position: relative;
  8. padding: 20px;
  9. width: 250px;
  10. }
  11. .input-group input{
  12. width: 200px;
  13. display: inline-block;
  14. }
  15. .inline-group span{
  16. display: inline-block;
  17. position: absolute;
  18. height: 12px;
  19. font-size: 8px;
  20. border: 1px solid red;
  21. background-color: coral;
  22. color: white;
  23. top: 41px;
  24. left: 20px;
  25. width: 202px;
  26. }
  27. </style>
  28. <title>高级版</title>
  29. </head>
  30. <body>
  31. <form action="/app02/form3/" method="POST">
  32. <div class="input-group">
  33. <!--{#接收后台传过来的form对象,自动生成input标签#} -->
  34. 用户名:{{ form.UserName }}
  35. <!--{#从后台传过来的error是字典,直接{{ error.user.0 }}呈现错误信息#} -->
  36. <!--{#如果后台返回了错误信息,将错误信息放入span标签,在页面显示,否则不显示#} -->
  37. {% if error.UserName.0 %}
  38. <span>{{ error.UserNamer.0 }}</span>
  39. {% endif %}
  40. </div>
  41. <div class="input-group">
  42. 密码:{{ form.Password }}
  43. {% if error.Password.0 %}
  44. <span>{{ error.Password.0 }}</span>
  45. {% endif %}
  46. </div>
  47. <div class="input-group">
  48. 邮箱:{{ form.Email }}
  49. {% if error.Email.0 %}
  50. <span>{{ error.Email.0 }}</span>
  51. {% endif %}
  52. </div>
  53. <!-- <div class="input-group">
  54. 详细介绍:{{ form.Memo }}
  55. {% if error.Memo.0 %}
  56. <span>{{ error.Memo.0 }}</span>
  57. {% endif %}-->
  58. </div>
  59. <div class="input-group">
  60. 书籍类型:{{ form.book_type }}
  61. {% if error.book_type.0 %}
  62. <span>{{ error.book_type.0 }}</span>
  63. {% endif %}
  64. </div>
  65.  
  66. <div>
  67. <input type="submit" value="提交" />
  68. </div>
  69. </form>
  70. </body>
  71. </html>

forms.py

  1. #coding:UTF8
  2. from django import forms
  3. from app02 import models
  4.  
  5. class Form3(forms.Form):
  6. UserName = forms.CharField(
  7. widget=forms.TextInput(attrs={'class': 'c1'}),
  8. error_messages={'required': '用户名不能为空'},
  9. )
  10. Password = forms.CharField(max_length=4, min_length=2,required=True)
  11. Email = forms.EmailField(error_messages={'required': '邮箱不能为空', 'invalid': '邮箱格式错误'})
  12.  
  13. #Memo = forms.CharField(required=False,widget=forms.Textarea())
  14. #直接写数据
  15. user_type_choice = (
  16. (0, '普通用户'),
  17. (1, '高级用户'),
  18. )
  19. #通过BookType表查询信息,values_list拿到的是元组。id作为value显示,caption作为text在页面显示
  20. # user_type_choice = models.BookType.objects.values_list('id', 'caption')
  21. book_type = forms.CharField(widget=forms.widgets.Select(choices=user_type_choice, attrs={'class': "form-control"}))
  22.  
  23. #写上以下代码就不用担心数据库添加了数据而不能及时获取了
  24. def __init__(self, *args, **kwargs):
  25. #每次创建Form1对象时执行init方法
  26. super(Form3, self).__init__(*args, **kwargs)
  27.  
  28. self.fields['book_type'] = forms.CharField(
  29. widget=forms.widgets.Select(choices=models.BookType.objects.values_list('id', 'caption'),
  30. attrs={'class': "form-control"}))

Django基础之form操作的更多相关文章

  1. Django基础之jQuery操作

    Django基础之jQuery操作 jquery之cookie操作 定义:让网站服务器把少量数据储存到客户端的硬盘或内存,从客户端的硬盘读取数据的一种技术: 下载与引入:jquery.cookie.j ...

  2. day 66 Django基础之jQuery操作cookie

    Django基础之jQuery操作cookie   jquery之cookie操作 定义:让网站服务器把少量数据储存到客户端的硬盘或内存,从客户端的硬盘读取数据的一种技术: 下载与引入:jquery. ...

  3. day 62 Django基础之jQuery操作cookie

    Django基础之jQuery操作cookie   jquery之cookie操作 定义:让网站服务器把少量数据储存到客户端的硬盘或内存,从客户端的硬盘读取数据的一种技术: 下载与引入:jquery. ...

  4. django基础 -- 10.form , ModelForm ,modelformset

    一.生成页面可用的 HTML标签 1.form 所有内置字段 Field required=True, 是否允许为空 widget=None, HTML插件 label=None, 用于生成Label ...

  5. Django基础之form组件

    Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...

  6. Django基础之Form表单验证

    Form表单验证 1.创建Form类(本质就是正则表达式的集合) from django.forms import Form from django.forms import fields from ...

  7. Django基础之form表单

    1. form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时, 我们在好多场景下都需要对用户的输入做校验, 比如 ...

  8. django基础之数据库操作

    Django 自称是“最适合开发有限期的完美WEB框架”.本文参考<Django web开发指南>,快速搭建一个blog 出来,在中间涉及诸多知识点,这里不会详细说明,如果你是第一次接触D ...

  9. 初学Django基础02 ORM操作

    django的ORM操作 之前我们知道了models.py这个文件,这个文件是用来读取数据结构的文件,每次操作数据时都走这个模块 常用字段 AutoField int自增列,必须填入参数 primar ...

随机推荐

  1. Homebrew设置代理

    在终端上输入环境变量: export ALL_PROXY=socks5://127.0.0.1:1080 注意:这个只在当前生效,关闭终端就不行了. 原理:本身使用curl进行访问,所以通过环境变量能 ...

  2. Python对象引用和del删除引用

    1.首先介绍下python的对象引用 1)Python中不存在传值调用,一切传递的都是对象引用,也可以认为是传址调用.即Python不允许程序员选择采用传值或传引用.Python参数传递采用的是“传对 ...

  3. vertical-aligin

    垂直对齐元素只应用于行内元素(图像.文本)和表单元素 垂直对齐文本会影响行高 默认值为baseline

  4. TCP/IP协议的三次握手及实现原理

    TCP/IP是很多的不同的协议组成,实际上是一个协议组,TCP用户数据报表协议(也称作TCP传输控制协议,Transport Control Protocol.可靠的主机到主机层协议.这里要先强调一下 ...

  5. bzoj 4561: [JLoi2016]圆的异或并

    Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个 ...

  6. JAVA基于权重的抽奖

    https://blog.csdn.net/huyuyang6688/article/details/50480687 如有4个元素A.B.C.D,权重分别为1.2.3.4,随机结果中A:B:C:D的 ...

  7. WPF 用户控件嵌入网页

    WPF使用用户控件嵌入网页,直接使用WebBrowser或Frame会产生报错,报错信息如下: 1.使用WebBrowser,<WebBrowser Source="http://19 ...

  8. java 基础 --- java8 HashMap

    问题 : HashMap 容量大小 (capacity)为什么为 2n HashMap 是线程安全的吗,为什么 HashMap 既然有hash进行排位还需要equals()作用是什么   文章部分图片 ...

  9. golang学习之接口型函数

    先说下使用接口型函数的好处: 1.不必将某个接口函数附在某个type上面,保证了命名随意 2. 可以直接调用函数或者使用该接口,两两不耽误 直接上代码吧: // interface_func proj ...

  10. java自学-流程控制语句

    一件事情从开始到结束,需要先做什么,再做什么,最后再怎么做,这段过程就是一个流程.程序逻辑处理也是一个流程,java中有专门的流程控制语句,主要分为这几种:顺序,判断,选择,循环. 1.顺序流程  顺 ...