Django之from表單
阿新 • • 發佈:2019-01-26
json int 如果 pos ttr proc invalid 提交表單 mda
from表單是自帶校驗宮能的 可以省區我們很多麻煩 現在我們來看下他的用法
1 # 註冊的視圖函數 2 def register(request): 3 if request.method == "POST": 4 # 這裏寫個一字典用來和前端的ajax進行交互 5 ret = {"status": 0, "msg": ""} 6 # 生成一個from對象 7 form_obj = forms.RegForm (request.POST) 8 # 校驗用戶輸入 9 ifform_obj.is_valid (): 10 ret["msg"] = "/index/" 11 # 刪掉確認密碼的字段 12 form_obj.cleaned_data.pop ("re_password") 13 # 取到用戶傳過來的頭像 14 avatar = request.FILES.get ("avatar") 15 # 傳入數據庫 16 # print(form_obj.cleaned_data["username"])17 models.UserInfo.objects.create_user (**form_obj.cleaned_data, avatar=avatar) 18 19 else: 20 ret["status"] = 1 21 ret["msg"] = form_obj.errors 22 return JsonResponse (ret) 23 # 生成一個form對象 24 form_obj = forms.RegForm () 25 return render (request, "register.html", {"form_obj": form_obj})
如上
form_obj.is_valid () 是django為我們提供用於校驗的方法 , 我們只需要把校驗通過的直接做我們需要做的處理就好了
如果有用戶輸入的不符合規範 Django會幫我們把報錯信息放在form_obj.errors 這個方法裏邊
這裏我們把錯誤信息做成了一個字典發到了前端 接下來我們看下前端的寫法
1 // 這裏是用ajxj提交表單的操作 2 $("#reg-submit").click(function () { 3 //var username = $("#id_username").val(); 4 //var password = $("#id_password").val(); 5 //var re_password = $("#id_re_password").val(); 6 //var email = $("#id_email").val(); 7 var formData = new FormData(); 8 formData.append("username",$("#id_username").val()); 9 formData.append("password",$("#id_password").val()); 10 formData.append("re_password",$("#id_re_password").val()); 11 formData.append("email",$("#id_email").val()); 12 formData.append("avatar",$("#id_avatar")[0].files[0]); 13 $.ajax({ 14 url:"/reg/", 15 type:"post", 16 processData:false, 17 contentType:false, 18 //data:{"username":username,"password":password,"re_password":re_password,"email":email}, 19 data:formData, 20 success:function (data) { 21 if (data.status) { 22 // 後端發來的是報錯信息 這裏寫一個循環取到這些報錯 23 $.each(data.msg,function (k,v) { 24 // 把獲取到的報錯信息填寫到表單下邊的span標簽 這裏做一個字符串的拼接取到對應的標簽 25 $("#id_"+k).next("span").text(v).parent().addClass("has-error") 26 }) 27 }else { 28 // 沒有錯誤就跳轉到指定頁面 29 location.href = data.msg; 30 } 31 32 } 33 }) 34 });
這樣我們就可以在用戶輸入不合法的時候可以給到提示了 下面是 我們創建發form類 和 檢驗 用戶名 和 密碼的 方法
1 from django import forms 2 from django.core.exceptions import ValidationError 3 from blog import models 4 5 # 定義一個註冊的form類 6 class RegForm(forms.Form): 7 username = forms.CharField( 8 max_length=16, 9 label="用戶名", 10 error_messages={ 11 "max_length": "用戶名最長16位", 12 "required": "用戶名不能為空", 13 }, 14 widget=forms.widgets.TextInput( 15 attrs={"class": "form-control"}, 16 ) 17 ) 18 19 password = forms.CharField( 20 min_length=6, 21 label="密碼", 22 widget=forms.widgets.PasswordInput( 23 attrs={"class": "form-control"}, 24 render_value=True, 25 ), 26 error_messages={ 27 "min_length": "密碼至少要6位!", 28 "required": "密碼不能為空", 29 } 30 ) 31 32 re_password = forms.CharField( 33 min_length=6, 34 label="確認密碼", 35 widget=forms.widgets.PasswordInput( 36 attrs={"class": "form-control"}, 37 render_value=True, 38 ), 39 error_messages={ 40 "min_length": "確認密碼至少要6位!", 41 "required": "確認密碼不能為空", 42 } 43 ) 44 45 email = forms.EmailField( 46 label="郵箱", 47 widget=forms.widgets.EmailInput( 48 attrs={"class": "form-control"}, 49 50 ), 51 error_messages={ 52 "invalid": "郵箱格式不正確!", 53 "required": "郵箱不能為空", 54 } 55 ) 56 57 58 # # 重寫全局的鉤子函數,對確認密碼做校驗 59 def clean(self): 60 password = self.cleaned_data.get("password") 61 re_password = self.cleaned_data.get("re_password") 62 63 if re_password and re_password != password: 64 self.add_error("re_password", ValidationError("兩次密碼不一致")) 65 66 else: 67 return self.cleaned_data 68 69 # 寫一個局部的鉤子函數 校驗用戶名是否被註冊 70 def clean_username(self): 71 username = self.cleaned_data.get("username") 72 is_enroll = models.UserInfo.objects.filter(username=username) 73 if is_enroll: 74 self.add_error("username",ValidationError("該用戶已經被註冊!")) 75 return username
這裏需要註意一點
當我們改寫的是全局的鉤子就需要返回一個全局的鉤子 , 我們改寫的是局部的鉤子 就必須返回一個局部的鉤子
Django之from表單