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. (转)sysbench部署与参数详解

    sysbench部署 原文:https://wing324.github.io/2017/02/07/sysbench%E9%83%A8%E7%BD%B2/ sysbench作为每一个系统管理员,都应 ...

  2. php在单个文件内开启dbug

    1.在文件开头添加如下代码 ini_set('display_errors', true); error_reporting(E_ALL);

  3. hibernate核心开发接口_Configuration

    AnnotationConfiguration继承自Configuration,这里以AnnotationConfiguration为例: new AnnotationConfiguration(). ...

  4. security和oauth2.0的整合

    security和oauth2.0的整合 之前已经介绍过security的相关的介绍,现在所需要做的就是security和oauth2.0的整合,在原有的基础上我们加上一些相关的代码;代码实现如下: ...

  5. Java中的语法树结构

    1.JCTypeParameter class B<T extends CA&IA&IB> { ...} 截图如下: 接口继承了StatementTree接口,而实现类实现 ...

  6. orcale 之 PL/SQL的游标

    根据我们之前了解到的情况,SQL是面向集合的,我们的查询结果一般包含多条数据,而在PL/SQL 中的变量一般只能存放一条数据,因此变量是无法满足我们的需求的.这时候我们就需要引入游标来为我们解决问题了 ...

  7. OpenJDK编译运行

    获取OpenJDK源码有两种方式,其中一种是通过Mercurial代码版本管理工具从Repository中直接取得源码(Repository地址:http://hg.openjdk.java.net/ ...

  8. 虚拟机下的zookeeper集群安装

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...

  9. FusionChart实现柱状图、饼状图的动态数据显示

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. RabbitMQ---7、常见参数含义

    简介 本节主要讨论队列声明的各个参数 queueDeclare(String queue, boolean durable, boolean exclusive, Map<String, Obj ...