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. How to deal with the problem '<' in OpenERP's view file

    In this case,if you write some stirng in your fields which contains '<' , OpenERP will give a err ...

  2. redux进阶 --- 中间件和异步操作

    你为什么需要异步操作? https://stackoverflow.com/questions/34570758/why-do-we-need-middleware-for-async-flow-in ...

  3. 【es6】js原生的promise

    JavaScript 是单线程的,这意味着任何两句代码都不能同时运行,它们得一个接一个来.在浏览器中,JavaScript 和其他任务共享一个线程,不同的浏览器略有差异,但大体上这些和 JavaScr ...

  4. Android多媒体技术之视频播放

    1.Android中视频播放方式 surfaceView+MediaPlayer,通过MediaPlayer来控制视频的播放.暂停.进度等: 使用VideoView 来播放,这个类其实也是继承了Sur ...

  5. python 脚本备份 mysql 数据库到 OSS

    脚本如下: #!/usr/bin/python ########################################################### ################ ...

  6. javaweb 实现跨域

    现在的一个web应用会涉及到多个地方的restAPi的调用,传统的jsonp虽然支持跨域,但是只是支持get请求. 传统的ajax请求是不支持跨域的,是为了安全考虑. 跨域的思路是跟http机制有关, ...

  7. linux系统挂载U盘,中文文件名乱码解决方案

    本人(壮壮熊)所用系统:ubuntu 12.4 今天在使用mount指令挂在硬盘时,出现令人头疼的中文文件名乱码. 问题: 使用mount /dev/sdb1 /media指令挂在第二颗硬盘的第一个分 ...

  8. 发布 .Net Core WebAPI 应用程序到 Docker

    目录 1. 创建 .net core webapi 项目 2. 编译应用 3. 创建 Dockerfile 文件 4. 上传文件到服务器 5. 生成Docker Image 6. 在Docker Co ...

  9. R语言矩阵matrix函数

    矩阵是元素布置成二维矩形布局的R对象. 它们包含相同原子类型的元素.尽管我们可以创建只包含字符或只逻辑值的矩阵,但是它们没有多大用处.我们使用的是在数学计算中含有数字元素矩阵. 使用 matrix() ...

  10. canvas的measureText()方法

    做一个小动画的时候遇到了个问题,就是在给文字应用渐变色的时候,不知怎么设置渐变色的区域. 渐变依赖于定义时的区域,超出这个区域只有纯色,而不是渐变色. 所以要取得文字的宽度. 查了资料得知,canva ...