Django基础之form操作
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>
密 码:<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操作的更多相关文章
- Django基础之jQuery操作
Django基础之jQuery操作 jquery之cookie操作 定义:让网站服务器把少量数据储存到客户端的硬盘或内存,从客户端的硬盘读取数据的一种技术: 下载与引入:jquery.cookie.j ...
- day 66 Django基础之jQuery操作cookie
Django基础之jQuery操作cookie jquery之cookie操作 定义:让网站服务器把少量数据储存到客户端的硬盘或内存,从客户端的硬盘读取数据的一种技术: 下载与引入:jquery. ...
- day 62 Django基础之jQuery操作cookie
Django基础之jQuery操作cookie jquery之cookie操作 定义:让网站服务器把少量数据储存到客户端的硬盘或内存,从客户端的硬盘读取数据的一种技术: 下载与引入:jquery. ...
- django基础 -- 10.form , ModelForm ,modelformset
一.生成页面可用的 HTML标签 1.form 所有内置字段 Field required=True, 是否允许为空 widget=None, HTML插件 label=None, 用于生成Label ...
- Django基础之form组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- Django基础之Form表单验证
Form表单验证 1.创建Form类(本质就是正则表达式的集合) from django.forms import Form from django.forms import fields from ...
- Django基础之form表单
1. form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时, 我们在好多场景下都需要对用户的输入做校验, 比如 ...
- django基础之数据库操作
Django 自称是“最适合开发有限期的完美WEB框架”.本文参考<Django web开发指南>,快速搭建一个blog 出来,在中间涉及诸多知识点,这里不会详细说明,如果你是第一次接触D ...
- 初学Django基础02 ORM操作
django的ORM操作 之前我们知道了models.py这个文件,这个文件是用来读取数据结构的文件,每次操作数据时都走这个模块 常用字段 AutoField int自增列,必须填入参数 primar ...
随机推荐
- (转)分布式中使用Redis实现Session共享(二)
上一篇介绍了一些redis的安装及使用步骤,本篇开始将介绍redis的实际应用场景,先从最常见的session开始,刚好也重新学习一遍session的实现原理.在阅读之前假设你已经会使用nginx+i ...
- 【Guava】Optional接口来避免空指针错误
null会带来很多问题,从开始有null开始有无数程序栽在null的手里,null的含义是不清晰的,检查null在大多数情况下是不得不做的,而我们又在很多时候忘记了对null做检查,在我们的产品真正投 ...
- 12.Proxy
1.概述 Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程. Proxy 可以理解成,在目标对象之前架 ...
- c++面试题中经常被面试官面试的小问题总结(二)(本篇偏向指针知识)
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/10713204.html 1.利用指针交换两个字符串方法?(这题是我当年读大一的时候看到的,好怀 ...
- 安卓加固之so文件加固
一.前言 最近在学习安卓加固方面的知识,看到了jiangwei212的博客,其中有对so文件加固的两篇文章通过节加密函数和通过hash段找到函数地址直接加密函数,感觉写的特别好,然后自己动手实践探索s ...
- uvm_config_db在UVM验证环境中的应用
如何在有效的使用uvm_config_db来搭建uvm验证环境对于许多验证团队来说仍然是一个挑战.一些验证团队完全避免使用它,这样就不能够有效利用它带来的好处:另一些验证团队却过多的使用它,这让验证环 ...
- golang的bytes.NewReader函数出现的问题
在我试图装入一个300mb的数据时,发生了溢出. 我本以为不会出现这种问题的(内存和硬盘都够用),可见golang的bytes包还是设置了容量限制的. 虽然通常来说300mb的[]byte不管什么情况 ...
- R语言格式化数字和字符串format函数
数字和字符串可以使用 format()函数的格式化为特定样式. 语法 format()函数的基本语法是: format(x, digits, nsmall,scientific,width,justi ...
- 信号量 P V测试详解
信号量 当我们编写的程序使用了线程时,不管它是运行在多用户系统上,多进程系统上,还是运行在多用户多进程系统上,我们通常会发现,程序中存在着一部分临界代码,我们需要确保只有一个进程可以进入这个临界代码并 ...
- SQL Server将DataTable传入存储过程(Table Value Parameter)
博主在做毕业设计的时候,需要用到事务处理和多次将数据写入不同的表中,但是 SQL Server 数据库是不支持数组类型变量的,想要实现数组的功能,可以通过 XML 和数据表的方法实现,但是实现方法非常 ...