我們之前寫的代碼都沒有對前端input框輸入的數據做驗證,我們今天來看下,如果做form表單的數據的驗證
在views文件做驗證
首先用文字描述一下流程
1、在views文件中導入forms模塊
2、然后創建一個類,繼承forms.form
3、然后在這個類中寫變量,這個變量的就是input標簽中的name,也就是前端往后端傳遞的k值,我們就可以對這個k值對應的v值做數據內容的校驗,比如是郵箱模式,比如是否允許空,最大字段長度,最小字段長度
4、然后在視圖函數中,實例化一個步驟3中的類,然后用這個對象去接受request.post中的值,然后對象就會根據post方式傳遞來的k值和類中的k對應,然后比較post傳遞過來的v值是否符合規范
5、
1、先導入forms模塊
from django import forms
2、創建模板的類
# 1、創建模板 class loginform(forms.Form): # 2、模板中的元素 name = forms.CharField(min_length=6,error_messages={"requird":"用戶名不能為空","min_length":"最小長度為6"}) # requird這個是錯誤碼 email = forms.EmailField()
這里這個error_messages寫出錯的信息,每個不同的錯誤碼對應不同的報錯信息
3、在視圖函數中使用這個類
def login(request): if request.method.lower() == "post": # 3、創建一個模板的對象,然后把數據傳遞個這個對象 obj = loginform(request.POST) # 4、啟動校驗 status= obj.is_valid() print(status) # 5、正確的信息 success_dict = obj.clean() print(success_dict) # 6、錯誤的信息 failed_dict = obj.errors.as_json() print(failed_dict) return redirect("/app1/login") else: return render(request,"login.html")
這里就會校驗前台發來的數據中,k為name和email的值的合法性
因為是form表單,所以提交后頁面會刷新,上次輸入的數據就沒有了,我們可以通過下面的方式實現保留上次輸入的值
前端代碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>form提交測試</h1> <form method="post" action="/app1/login/"> <p> {# <input type="text" name="name" placeholder="用戶名">#} {# 這段html要django幫我們生成#} {{ xx.name }} <span>{{ xx.error.name.0 }}</span> </p> <p> {# <input type="text" name="email" placeholder="郵箱">#} {# 這段html要django幫我們生成#} {{ xx.email }} <span>{{ xx.error.email.0 }}</span> </p> <p> <input type="text" name="pwd" placeholder="密碼"> </p> <input type="submit" value="submit提交"> <input type="button" value="ajax提交" id="ajax_test1"> </form> <script src="/static/jq/jquery-3.3.1.js"></script> <script> $(function () { }) $("#ajax_test1").bind("click",function () { $.ajax({ url:"/app1/login/", type:"POST", data:{ name:"cui", email:"cui@126.com", pwd:"admin123." } } ) }) </script> </body> </html>
后端代碼
from django.shortcuts import render from django.shortcuts import HttpResponse from django.shortcuts import redirect # Create your views here. from django import forms """ def login(request): if request.method.lower() == "post": print(request.POST.get("name")) return redirect("/app1/login") else: return render(request,"login.html") # return redirect("/app1/login") # return HttpResponse("hahh") """ # 1、創建模板 class loginform(forms.Form): # 2、模板中的元素 name = forms.CharField(min_length=6,error_messages={"required":"用戶名不能為空","min_length":"最小長度為6666666666"}) # requird這個是錯誤碼 email = forms.EmailField(error_messages={"required":"郵箱不能為空","invalid":"郵箱格式錯誤"}) def login(request): if request.method.lower() == "post": # 3、創建一個模板的對象,然后把數據傳遞個這個對象 obj = loginform(request.POST) # 4、啟動校驗 status= obj.is_valid() print(status) # 5、正確的信息 success_dict = obj.clean() print("正確的信息----------->",success_dict) # 6_1、錯誤的信息1 # failed_dict = obj.errors.as_json() # 6_2、錯誤的信息1 failed_dict = obj.errors if not obj.is_valid(): # print(failed_dict["name"]) # print(failed_dict["name"][0]) print("錯誤的信息----------->",failed_dict) print("名稱的錯誤信息-------->",failed_dict["name"][0]) print("郵箱的錯誤信息-------->", failed_dict["email"][0]) return render(request, "login.html", {'xx': obj}) # return redirect("/app1/login") else: obj = loginform() # return render(request,"login.html") # return redirect("/app1/login") return render(request,"login.html",{"xx":obj}) # return HttpResponse("hahh")
主要是要看這里
#Auther Bob #--*--conding:utf-8 --*-- from django import forms from django.forms import widgets class DeatilForm(forms.Form): # pwd = forms.CharField(widget=widgets.PasswordInput()) # user = forms.CharField(widget=widgets.TextInput()) pwd = forms.CharField(widget=widgets.PasswordInput(attrs={"class":"c1","placeholder":"密碼"})) user = forms.CharField(widget=widgets.TextInput(attrs={"class":"c2","placeholder":"用戶名"})) age = forms.IntegerField() # 這里的效果是輸入框只能輸入數字,其他的都無法輸入 choice1 = forms.ChoiceField(choices=[(1,"內蒙古"),(2,"廣東"),(3,"黑龍江")]) choice2 = forms.CharField( widget=widgets.Select(choices=[(1,"內蒙古"),(2,"廣東"),(3,"黑龍江")]) ) choice3 = forms.IntegerField( widget=widgets.Select(choices=[(1,"內蒙古"),(2,"廣東"),(3,"黑龍江")]) ) choice4 = forms.IntegerField( widget=widgets.RadioSelect(choices=[(1,"內蒙古"),(2,"廣東"),(3,"黑龍江")]) ) # 進行一下字段學習 class FiledForm(forms.Form): arg1 = forms.CharField( # 這個屬性是charfiled特有的 # max_length=233,最大的字符長度 # min_length=234,最小的字符長度 # 下面這些屬性是filed都有的,下面參數都可以用下面的參數 # required=True 是否必填 # label=None 就是顯示一個字符串,在前台渲染的時候用obj.arg1.label就會顯示label的值,只是一個錦上添花的作用 # initial=None 這里就是一個默認值,也就是初始值 # help_text=''這里就是一個幫助信息 # error_messages=None 出錯的時候顯示的信息 # show_hidden_initial=False 是否生成帶有默認值的一個隱藏的標簽,可以用來判斷現在的輸入值和默認值是否相同 # validators=() 自定義一個正則表達式 # localize=False 是否支持本地化,暫時不需要掌握 # disabled=False 標簽是否能否能編輯 # label_suffix=None 默認這個值就是冒號,也就是前面label的值和input框之間的冒號,如果設置了這個值,就會替代lable和input框中之間的冒號 # error_messages=None # error_messages={"required":"不能為空","invalid":"格式錯誤",} ) arg2 = forms.IntegerField( # max_value=23, 最大值 # min_value=21. 最小值 ) arg3 = forms.FloatField( ) arg4 = forms.DateField( # 頁面必須要滿足這個格式,格式是:2015-09-03 ) arg5 = forms.TimeField( # 頁面必須要滿足這個格式,格式是:11:34 ) arg6 = forms.DateTimeField( # 頁面必須要滿足這個格式,格式是:2015-09-03 11:34 ) arg7 = forms.EmailField( ) arg8 = forms.PasswordInput( ) arg9 = forms.RegexField( # 通過正則表達式自定義字段 ) arg10 = forms.FileField( ) arg11 = forms.ImageField( ) # 單選框 arg12 = forms.ChoiceField( initial=2, choices=((1,"內蒙古"),(2,"黑龍江"),(3,"廣東")) ) # 多選框 arg13 = forms.MultipleChoiceField( initial=[1,2], choices=((1,"內蒙古"),(2,"黑龍江"),(3,"廣東")) ) arg14 = forms.FilePathField( # recursive=False 是否遞歸顯示,是否顯示文件下的文件 # 指定一個路徑,會把這個路徑下所有的文件和路徑用select框顯示出來 ) arg15 = forms.GenericIPAddressField( # 解析ip地址 ) arg16 = forms.SlugField( # 只允許輸入,字母數字和下划線減號 ) arg17 = forms.UUIDField( # 只支持uuid格式的輸入 ) # 這里的arg*就是k值
f8 = fields.ChoiceField( choices=[(1, "上海3"), (2, "北京3"), (3, "深圳3")], initial=3, required=True, label="城市", label_suffix="------>" ) f9 = fields.TypedChoiceField( choices=[(1, "上海4"), (2, "北京4"), (3, "深圳4")], initial=3, required=True, coerce=lambda x:int(x) ) f10 = fields.MultipleChoiceField( choices=[(1, "上海5"), (2, "北京5"), (3, "深圳5")], initial=[1,3,] ) f11 = fields.TypedMultipleChoiceField( choices=[(1, "上海5"), (2, "北京5"), (3, "深圳5")], initial=[1, 3, ], coerce=lambda x:int(x), ) f12 = fields.FilePathField(path="app1",allow_folders=True,recursive=False,allow_files=) # recursive:遞歸顯示,true不顯示,false顯示 # allow_folders:是否顯示文件夾 # allow_files:是否顯示文件 f13 = fields.GenericIPAddressField( protocol="both" ) f13 = fields.SlugField() # 只允許數字,字母,下划線,減號
widget可以指定插件的類型