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

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

form1.html

 <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>基础版</title>
</head>
<body>
<!--{#{{ error }}接收后台返回的错误信息封装在ul,li标签里面:#} -->
{{ error }}
<form action="/app02/form1/" method="POST">
<div>
用户名:<input type="text" name="username" />
</div>
<div>
密&nbsp;&nbsp;码:<input type="text" name="password" />
</div>
<div>
<input type="submit" value="提交" />
</div>
</form>
</body>
</html>

forms.py

#coding:UTF8
from django import forms
from app02 import models
class UserMessage(forms.Form):
UserName = forms.CharField(max_length=100,label='用户名')
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

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

form2.html

 <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>进阶版</title>
<style>
.input-group{
position: relative;
padding: 20px;
width: 250px;
}
.input-group input{
width: 200px;
display: inline-block;
}
</style>
</head>
<body>
<form action="/app02/form2/" method="POST">
<div class="input-group">用户名:
<!-- {#接收后台传过来的form对象,自动生成input标签#}-->
{{ form.UserName }}
<!-- {#从后台传过来的error是字典,直接{{ error.UserName.0 }}呈现错误信息#} -->
       <!-- {#如果后台返回了错误信息,将错误信息放入span标签,在页面显示,否则不显示#}-->
{% if error.UserName.0 %}
<span>{{ error.UserName.0 }}</span>
{% endif %}
</div>
<div class="input-group">密码:
{{ form.Password }}
{% if error.Password.0 %}
<span>{{ error.Password.0 }}</span>
{% endif %}
</div>
<div>
<input type="submit" value="提交" />
</div>
</form>
</body>
</html>

forms.py

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

案例三:

models.py

 #coding:Utf8
from __future__ import unicode_literals from django.db import models
from django import forms # Create your models here.
class Author(models.Model):
#作者
name = models.CharField(max_length=100)
age = models.IntegerField() class BookType(models.Model):
#图书类型
caption = models.CharField(max_length=64) class Book(models.Model):
#图书
name = models.CharField(max_length=64)
pages = models.IntegerField()
price = models.DecimalField(max_digits=10,decimal_places=2)
pubdate = models.DateField() authors = models.ManyToManyField(Author)
book_type = models.ForeignKey(BookType)

views.py

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

form3.html

 <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
.input-group{
position: relative;
padding: 20px;
width: 250px;
}
.input-group input{
width: 200px;
display: inline-block;
}
.inline-group span{
display: inline-block;
position: absolute;
height: 12px;
font-size: 8px;
border: 1px solid red;
background-color: coral;
color: white;
top: 41px;
left: 20px;
width: 202px;
}
</style>
<title>高级版</title>
</head>
<body>
<form action="/app02/form3/" method="POST">
<div class="input-group">
<!--{#接收后台传过来的form对象,自动生成input标签#} -->
用户名:{{ form.UserName }}
<!--{#从后台传过来的error是字典,直接{{ error.user.0 }}呈现错误信息#} -->
<!--{#如果后台返回了错误信息,将错误信息放入span标签,在页面显示,否则不显示#} -->
{% if error.UserName.0 %}
<span>{{ error.UserNamer.0 }}</span>
{% endif %}
</div>
<div class="input-group">
密码:{{ form.Password }}
{% if error.Password.0 %}
<span>{{ error.Password.0 }}</span>
{% endif %}
</div>
<div class="input-group">
邮箱:{{ form.Email }}
{% if error.Email.0 %}
<span>{{ error.Email.0 }}</span>
{% endif %}
</div>
<!-- <div class="input-group">
详细介绍:{{ form.Memo }}
{% if error.Memo.0 %}
<span>{{ error.Memo.0 }}</span>
{% endif %}-->
</div>
<div class="input-group">
书籍类型:{{ form.book_type }}
{% if error.book_type.0 %}
<span>{{ error.book_type.0 }}</span>
{% endif %}
</div> <div>
<input type="submit" value="提交" />
</div>
</form>
</body>
</html>

forms.py

 #coding:UTF8
from django import forms
from app02 import models class Form3(forms.Form):
UserName = forms.CharField(
widget=forms.TextInput(attrs={'class': 'c1'}),
error_messages={'required': '用户名不能为空'},
)
Password = forms.CharField(max_length=4, min_length=2,required=True)
Email = forms.EmailField(error_messages={'required': '邮箱不能为空', 'invalid': '邮箱格式错误'}) #Memo = forms.CharField(required=False,widget=forms.Textarea())
#直接写数据
user_type_choice = (
(0, '普通用户'),
(1, '高级用户'),
)
#通过BookType表查询信息,values_list拿到的是元组。id作为value显示,caption作为text在页面显示
# user_type_choice = models.BookType.objects.values_list('id', 'caption')
book_type = forms.CharField(widget=forms.widgets.Select(choices=user_type_choice, attrs={'class': "form-control"})) #写上以下代码就不用担心数据库添加了数据而不能及时获取了
def __init__(self, *args, **kwargs):
#每次创建Form1对象时执行init方法
super(Form3, self).__init__(*args, **kwargs) self.fields['book_type'] = forms.CharField(
widget=forms.widgets.Select(choices=models.BookType.objects.values_list('id', 'caption'),
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. Asp.NET MVC 拍卖网站,拆解【1】预览与目录

    本人最近带创业团队基本做完了一个艺术品拍卖的外包项目,分为网站前台(asp.net mvc5),网站管理员管理的后台使用的9900端口(asp.net mvc5),监听拍卖状态的windows服务,为 ...

  2. Win10 VS2015 静态编译Qt5.6.2源码

    由于VS2015需要CRT等拓展组件,因此把内部编写的工具软件以静态发布,固需要编译Qt源码.Qt5.6.2版本,VS2015,Win10 1.安装python,perl,下载jom 2.改文件com ...

  3. JS检测数据类型

    如果你要判断的是基本数据类型或JavaScript内置对象,使用toString: 如果要判断的时自定义类型,请使用instanceof. 1.typeof typeof操作符返回的是类型字符串,它的 ...

  4. 全网最详细的Git学习系列之安装各个Git图形客户端(Windows、Linux、Mac系统皆适用ing)(图文详解)

    不多说,直接上干货! 目前Git图形客户端 TortoiseGit .SourceTree .GitUp .SmartGit .QGit .GitX .Gitnub.Tower .Git-cola . ...

  5. console和chrom-tool

    资料整理自网络 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...

  6. strcpy和strncpy

    在c语言中,对于简单变量,如int型.double型,直接使用赋值符号“=”,即可完成赋值,如 int a=10: int b: b=a: 即可完成用a给b赋值. 但是对于字符串,这样赋值是不准确的. ...

  7. weblogic 异常常见处理方法

    1.系统日志 通过分析weblogic的系统日志及应用程序出错的地方,可能找到异常的原因. 2. 数据库连接 如果用户访问系统过慢,且连接池已经占满而weblogic的线程数量很少,就要查看应用是否没 ...

  8. 八段代码彻底掌握 Promise

    1.Promise的立即执行性 var p = new Promise(function(resolve, reject){ console.log("create a promise&qu ...

  9. [转]玩转Windows服务系列——命令行管理Windows服务

    本文转自:http://www.cnblogs.com/hbccdf/p/managewindowsservicewithcmd.html 说到Windows服务的管理就不得不说通过命令行的方式管理W ...

  10. 分享一个好用的dns