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. CKEditor图片上传实现详细步骤(使用Struts 2)

    本人使用的CKEditor版本是3.6.3.CKEditor配置和部署我就不多说. CKEditor的编辑器工具栏中有一项“图片域”,该工具可以贴上图片地址来在文本编辑器中加入图片,但是没有图片上传. ...

  2. 关于Java的权限修饰符(public,private,protected,默认friendly)

    以前对访问修饰符总是模棱两可,让自己仔细解释也是经常说不很清楚.这次要彻底的搞清楚. 现在总结如下: 一.概括总结 各个访问修饰符对不同包及其子类,非子类的访问权限 Java访问权限修饰符包含四个:p ...

  3. IO流(二)字符流

    1.字符流:在字节流的基础上添加了编码机制.很大程度上和字节流操作一样的,字符流只能操作文本类文件,准确的说应该是纯文本类文件.例如.txt,.java,.cpp,.html等 编码:每一个国家都有自 ...

  4. Chapter 14. Blocks and Statements

    14.5. Statements There are many kinds of statements in the Java programming language. Most correspon ...

  5. linux下wc功能的简单实现

    1.代码来源:自己编写 2.运行环境:linux终端 3.编程语言:c/c++语言 4.bug:未发现 5.当前功能:可以统计字符的字符数.行数.单词数 6.使用方法:wc -l 文件名-->统 ...

  6. Java面试题-Java容器

    一.Java容器分类 Java容器划分为两个概念Collection.Map Collection: 一个独立元素的序列,这些元素都服从一条或多条规则.List必须按照插入的顺序保存元素,不关心是否重 ...

  7. Nexus centos 安装

    目录 1.安装nexus 2.启动nexus 2.1启动服务器 2.2以后台进程启动: 2.3web访问 3.搭建私服 3.1 界面元素介绍 3.2 仓库集合的界面 3.3 通过网页方式将jar包上传 ...

  8. 码表的理解(ASCII,GBK,Unicode,UTF-8等)。

    以下任何言论都完全是个人的理解,如有雷同纯属巧合,如有错误,希望大家多多指出,共同学习!谢谢! 笔者是一个理解能力偏慢.稍钻牛角尖的程序员,什么东西都要从最基础理解起,一步一步向上理解,因此讲述时也是 ...

  9. [转] sqlserver 中查看trigger的disabled/enabled情况

    本文转自:http://blog.csdn.net/miqi770/article/details/48708199 SELECT t.name AS TableName, tr.name AS Tr ...

  10. [转]WxEmojiView

    本文转自:https://github.com/icindy/WxEmojiView 来源信息 author: Di (微信小程序开发工程师) organization: WeAppDev(微信小程序 ...