1. 程式人生 > >Django之from表單

Django之from表單

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         if
form_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表單