作者:刘耀

瞎copy伸手党 我在诅咒你。

Django的form的作用:

1、生成html标签

2、用来做用户提交的验证

3、可以和models一起使用(modelform)

一、form基础

工程和app创建步骤省略

1.在app下面创建forms.py (用于放置所有form结构)

内容如下:
#!/usr/bin/env python3
#coding:utf8
from django import forms #导入django的forms
class UserInfo(forms.Form): #创建一个类 继承form方法
user = forms.CharField()
password = forms.CharField()
email = forms.EmailField(required=False)
#required是否可以为空,如果为False说明可以为空
mobile = forms.CharField()

2.在views里创建函数

from django.shortcuts import render,HttpResponse

# Create your views here.
from crm import forms #导入form def index(request):
obj = forms.UserInfo() #创建对象
return render(request,'index.html',{'obj':obj}) #将对象传入

3.创建访问url

url(r'^$',views.index),

4.创建index页面

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post">{% csrf_token %}
<h1>用户名:{{ obj.user }}</h1>
<h1>密码:{{ obj.password }}</h1>
<h1>邮箱:{{ obj.email }}</h1>
<h1>手机号:{{ obj.mobile }}</h1>
<input type="submit" value="submit"/>
</form>
</body>
</html>

5.访问测试

自己测试吧。哈哈哈哈哈哈哈哈哈哈哈。

以上只是简单的生成页面而已,下面让你瞅瞅如何接收验证form提交给后台的内容

只要修改views里的index函数就可以

from django.shortcuts import render,HttpResponse

# Create your views here.
from crm import forms
def index(request):
obj = forms.UserInfo()
if request.method == 'POST':
#将post过来的数据交给userinfo这个类处理之后把结果封装到user_obj
user_obj = forms.UserInfo(request.POST)
print(user_obj.is_valid())
#[结果是:True or False]
#----------------------------
#is_vaild返回是True或者flase
#通过is_valid()来判断用户输入是否合法!
# 如果不合法就把返回信息发送过去,如果合法获取数据操作即可!
#捕获错误信息并返回(来自罗天帅)
if user_obj.is_valid():
#获取前端提交的数据
print(user_obj.clean())
#结果[{'email': 'LIUYAO@qq.com', 'mobile': '110', 'password': 'WOSHIDASAHBI', 'user': 'LIUYAO'}]
else:
#如果返回false那么肯定是错误提交
user_error = user_obj.errors
#打印错误信息
print (user_error)
#错误信息应该是一个html页面
#<ul class="errorlist"><li>mobile<ul class="errorlist">
# <li>This field is required.</li></ul></li><
# li>password<ul class="errorlist"><li>This field is required.</li>
# </ul></li><li>user<ul class="errorlist"><li>This field is required.</li>
# </ul></li></ul>
#把错误信息返回给前端页面
return render(request,'index.html',{'obj':obj,'user_error':user_error})
return render(request,'index.html',{'obj':obj})

几个方法如下

#创建对象
obj = forms.UserInfo()
#获取post数据
user_obj = forms.UserInfo(request.POST)
#验证数据
print(user_obj.is_valid())
#打印前端传过来的具体数据值
print(user_obj.clean())
#获取错误信息
user_error = user_obj.errors

二、form定制化

1.自定义报错内容:

使用error_messages={'required':'自定义内容'}

修改forms文件如下:

from django import forms
class UserInfo(forms.Form):
user = forms.CharField(error_messages={'required':'用户名不能为空'})
password = forms.CharField(error_messages={'required':'密码不能为空'})
email = forms.EmailField(required=False) #required是否可以为空,如果为False说明可以为空
mobile = forms.CharField(error_messages={'required':'手机号不能为空'})

测试访问

2.给表单添加css属性和默认显示

#!/usr/bin/env python3
#coding:utf8
from django import forms
class UserInfo(forms.Form):
user = forms.CharField(error_messages={'required':'用户名不能为空'})
password = forms.CharField(error_messages={'required':'密码不能为空'})
email = forms.EmailField(required=False) #required是否可以为空,如果为False说明可以为空
mobile = forms.CharField(error_messages={'required':'手机号不能为空'},
widget=forms.TextInput(attrs={'class':'form-control','placeholder':u'手机号码'})
) 方法:
widget=forms.TextInput(attrs={'class':'form-control','placeholder':u'手机号码'}) index页面加上一个style <style>
.form-control{
background-color:crimson;
}
</style>

测试访问:

三、自定义验证

当前端js被禁用的时候,那么提交的时候,就不能判断输入的合法性等等

所以要在后端也加上一个验证,如果不通过刷新显示。

一个简单的用户注册案例:

修改forms.py如下

#!/usr/bin/env python3
#coding:utf8
import re
from django import forms
from django.core.exceptions import ValidationError #定义一个用于验证手机号是否合法的函数
def PhoneValidate(value):
#正则匹配
phone_re = re.compile(r'^(13[0-9]|15[012356789]|17[0678]|18[0-9]|14[57])[0-9]{8}$')
if not phone_re.match(value):
raise ValidationError('手机号码格式错误')
class UserInfo(forms.Form):
user = forms.CharField(error_messages={'required':'用户名不能为空'})
password = forms.CharField(error_messages={'required':'密码不能为空'})
email = forms.EmailField(required=False) #required是否可以为空,如果为False说明可以为空
#使用validators可以调用自己自定义的方法
phone = forms.CharField(validators=[PhoneValidate,],
error_messages={'required':'手机号不能为空'},
widget=forms.TextInput(attrs={'class':'form-control','placeholder':u'手机号码'}),
)

index页面

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.form-control{
background-color:crimson;
}
</style> </head>
<body>
<form action="" method="post">{% csrf_token %}
<h1>用户名:{{ obj.user }}<h5>{{ user_error.user }}</h5></h1>
<h1>密码:{{ obj.password }}<h5>{{ user_error.password }}</h5></h1>
<h1>邮箱:{{ obj.email }}<h5>{{ user_error.email }}</h5></h1>
<h1>手机号:{{ obj.phone }}<h5>{{ user_error.phone }}</h5></h1>
<input type="submit" value="注册"/>
</form>
</body>
</html>

访问如下:

四、生成select标签

#!/usr/bin/env python3
#coding:utf8
import re
from django import forms
from django.core.exceptions import ValidationError #定义一个用于验证手机号是否合法的函数
def PhoneValidate(value):
#正则匹配
phone_re = re.compile(r'^(13[0-9]|15[012356789]|17[0678]|18[0-9]|14[57])[0-9]{8}$')
if not phone_re.match(value):
raise ValidationError('手机号码格式错误')
class UserInfo(forms.Form):
vip_type = (
(0, u'普通用户'),
(1, u'高级用户'),)
vip = forms.CharField(widget=forms.widgets.Select(choices=vip_type,attrs={'class':'form-control'}),
)
user = forms.CharField(error_messages={'required':'用户名不能为空'})
password = forms.CharField(error_messages={'required':'密码不能为空'})
email = forms.EmailField(required=False) #required是否可以为空,如果为False说明可以为空
phone = forms.CharField(validators=[PhoneValidate,],
error_messages={'required':'手机号不能为空'},
widget=forms.TextInput(attrs={'class':'form-control','placeholder':u'手机号码'}),
)

index页面

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.form-control{
background-color:crimson;
}
</style>
</head>
<body>
<form action="" method="post">{% csrf_token %}
<h1>会员级别:{{ obj.vip }}<h5>{{ user_error.vip }}</h5></h1>
<h1>用户名:{{ obj.user }}<h5>{{ user_error.user }}</h5></h1>
<h1>密码:{{ obj.password }}<h5>{{ user_error.password }}</h5></h1>
<h1>邮箱:{{ obj.email }}<h5>{{ user_error.email }}</h5></h1>
<h1>手机号:{{ obj.phone }}<h5>{{ user_error.phone }}</h5></h1>
<input type="submit" value="注册"/>
</form>
</body>
</html>

测试访问:

就先这么写吧

参考:

http://www.cnblogs.com/luotianshuai

http://www.cnblogs.com/alex3714/

http://www.cnblogs.com/wupeiqi/

官方文档:

https://docs.djangoproject.com/en/1.9/topics/forms/

3.django笔记之form表单的更多相关文章

  1. Django组件之Form表单

    一.Django中的Form表单介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入 ...

  2. 第三百一十一节,Django框架,Form表单验证

    第三百一十一节,Django框架,Form表单验证 表单提交 html <!DOCTYPE html> <html lang="en"> <head& ...

  3. Django框架 之 Form表单和Ajax上传文件

    Django框架 之 Form表单和Ajax上传文件 浏览目录 Form表单上传文件 Ajax上传文件 伪造Ajax上传文件 Form表单上传文件 html 1 2 3 4 5 6 7 <h3& ...

  4. Django中的Form表单

    Django中已经定义好了form类,可以很容易的使用Django生成一个表单. 一.利用Django生成一个表单: 1.在应用下创建一个forms文件,用于存放form表单.然后在forms中实例华 ...

  5. Django中的Form表单验证

    回忆一下Form表单验证的逻辑: 前端有若干个input输入框,将用户输入内容,以字典传递给后端. 后端预先存在一个Form表单验证的基类,封装了一个检测用户输入是否全部通过的方法.该方法会先定义好错 ...

  6. Django 中的Form表单认证

    一.Form表单   1.1 Form的几个功能 验证用户数据(显示错误信息) 初始化页面显示内容 HTML Form提交保留上次提交数据 生成HTML标签   1.2 创建表单类Form 1. 创建 ...

  7. the django travel three[form表单验证]

    一:表单验证: 场景:因为浏览器的js可以被禁用,所以需要做后台的输入合法的验证. A:ajax发请求.需要注意的是ajax POST的数据的key值和form表单的里的字段名字一致,否则得不到验证! ...

  8. Django基础之Form表单验证

    Form表单验证 1.创建Form类(本质就是正则表达式的集合) from django.forms import Form from django.forms import fields from ...

  9. Django获取用户form表单

    首先创建一个Django 的工程项目 前面我们说过了,那到一个项目首先把模板路径,和静态路径在settings.py设置好以后,在开始写代码,写代码也要按照我们以前说的那个工程目录结构写. 现在我们做 ...

随机推荐

  1. golang thrift 总结一下网络上的一些坑

    我们以hello world来大概分析一下golang中的thrift包,并且扒一扒网络上有关thrift的一些坑 查看源码,服务器定义如下:(详见simple_server.go文件) type T ...

  2. 【BZOJ-3293&1465&1045】分金币&糖果传递×2 中位数 + 乱搞

    3293: [Cqoi2011]分金币 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 854  Solved: 476[Submit][Status] ...

  3. BZOJ-1087 互不侵犯King 状压DP+DFS预处理

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2337 Solved: 1366 [Submit][ ...

  4. 装了虚拟机,但是没有虚拟网卡vmnet0 vmnet1 vmnet8

    在服务里面启动图中的两个服务,在再你的虚拟网络编辑器里面点恢复默认设置就会出现了,我的是win8.1,默认这两个服务是手动启动的,可能是优化软件优化的结果 我是win10  里面显示以太网3 和 4, ...

  5. 通过HTTP协议实现多线程下载

    1. 基本原理,每条线程从文件不同的位置开始下载,最后合并出完整的数据. 2. 使用多线程下载的好处     下载速度快.为什么呢?很好理解,以往我是一条线程在服务器上下载.也就是说,对应在服务器上, ...

  6. Android 服务类Service 的详细学习

    http://blog.csdn.net/vipzjyno1/article/details/26004831 Android服务类Service学习四大组建   目录(?)[+] 什么是服务 服务有 ...

  7. CentOS 配置hadoop

    Hadoop是用作处理大数据用的,核心是HDFS.Map/Reduce.虽然目前工作中不需要使用这个,但是,技多不压身,经过虚拟机很多遍的尝试,终于将Hadoop2.5.2的环境顺利搭建起来了.    ...

  8. 深入解析MySQL分区(Partition)功能

    自5.1开始对分区(Partition)有支持 = 水平分区(根据列属性按行分)= 举个简单例子:一个包含十年发票记录的表可以被分区为十个不同的分区,每个分区包含的是其中一年的记录. === 水平分区 ...

  9. arp绑定网关MAC地址错误

    为了防止局域网的arp 要绑定网关MAC地址 在vista/win中 用 arp -s 绑定网关会出现错误 ARP 项添加失败 C:\Users\sink>arp -a 接口: 10.200.5 ...

  10. JS面试题及答案总结

    1. 截取字符串abcdefg的efg  <div id="test">abcdefg</div> var mytext=document.getEleme ...