3.django笔记之form表单

作者:刘耀

瞎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/

posted @ 2016-05-29 14:25  刘耀  阅读(1147)  评论(0编辑  收藏  举报