3.django筆記之form表單

做者:劉耀css

瞎copy伸手黨 我在詛咒你。html

Django的form的做用:

一、生成html標籤前端

二、用來作用戶提交的驗證python

三、能夠和models一塊兒使用(modelform)django

1、form基礎

工程和app建立步驟省略後端

1.在app下面建立forms.py (用於放置全部form結構)app

內容以下:
#!/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.建立訪問urlpost

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

2、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>

測試訪問:

3、自定義驗證

當前端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>

訪問以下:

4、生成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/

相關文章
相關標籤/搜索