1. 程式人生 > >基於ModelForm檢驗註冊資訊

基於ModelForm檢驗註冊資訊

一、在app01下建立form.py

程式碼裡參照的表為Django自帶的auth_user表

 1 from django import forms
 2 import re
 3 from django.contrib.auth.models import User
 4 from django.core.exceptions import ValidationError
 5 from django.forms import widgets as wid
 6 class UserModelForm(forms.ModelForm):
 7     class Meta:
 8         #
參照表 9 model=User 10 #顯示錶裡的所有欄位 11 fields='__all__' 12 #選取表裡顯示的欄位 13 fields=['username','password','email'] 14 #排除不顯示的欄位 15 exclude=['title'] 16 labels={ 17 'username':'使用者名稱', 18 'password':'密碼', 19 '
email':'郵箱' 20 } 21 #設定提示資訊 22 error_messages={ 23 'username':{'required':'使用者名稱不能為空'}, 24 'password':{'required':'密碼不能為空'}, 25 'email':{'required':'郵箱不能為空'}, 26 'rpassword':{'required':'確認密碼不能為空'} 27 } 28 widgets={
29 'pub_data':wid.TextIput(attrs={'type':'data'}) 30 } 31 #可以設定表裡沒有的欄位 32 rpassword = forms.CharField(min_length=5, 33 label='確認密碼', 34 error_messages={'required':'確認密碼不能為空'} 35 ) 36 def clean_username(self): 37 val = self.cleaned_data.get('username') 38 ret = User.objects.filter(username=val).first() 39 if ret: 40 raise ValidationError('使用者名稱已存在') 41 else: 42 return val 43 44 def clean_email(self): 45 val = self.cleaned_data.get('email') 46 if re.search('\[email protected]$', val): 47 return val 48 else: 49 raise ValidationError('郵箱必須是136格式') 50 def clean(self): 51 password=self.cleaned_data.get('password') 52 rpassword=self.cleaned_data.get('rpassword') 53 if password and rpassword: 54 if password == rpassword: 55 return self.cleaned_data 56 else: 57 raise ValidationError('兩次密碼不一致') 58 else: 59 return self.cleaned_data 60 def __init__(self,*args,**kwargs): 61 super().__init__(*args,**kwargs) 62 for filed in self.fields.values(): 63 #可以設定統一的屬性 64 # filed.error_messages={'required':'該使用者資訊不能為空'} 65 filed.widget.attrs.update({"class":'form-control'})

二、views 檢視函式

def regist(request):
    res={'error':'','user':None}
    if request.method=="GET":
        form=UserModelForm()
        return render(request,'regist.html',{'form':form})
    else:
        form=UserModelForm(request.POST)
        if form.is_valid():
            obj=form.save() #create 儲存資訊
            res['user']='ok'
        else:
            error=form.errors
            res['error']=error

        return JsonResponse(res)

三、HTML頁面  表單通過form類渲染

使用Ajax傳送資料,根據返回資訊將錯誤提示顯示到對應的表單下

 1 <body>
 2 <div class="container">
 3     <div class="row c1">
 4         <div class="col-md-8 col-md-offset-2">
 5         {% csrf_token %}
 6                 <form action="" method="post" novalidate>
 7                     {% for field in form %}
 8                         <div>
 9                              <label for="">{{ field.label }}</label>
10                             {{ field }} <span class="error"></span>
11                     {% endfor %}
12                         </div>
13                     <input type="button" class="btn btn-warning" value="註冊">
14                 </form>
15         </div>
16     </div>
17 </div>
18 
19 <script>
20     $(function () {
21         $('.btn').click(function () {
22             $.ajax({
23                 url:'',
24                 type:'post',
25                 data:{
26                     username:$('#id_username').val(),
27                     password:$('#id_password').val(),
28                     rpassword:$('#id_rpassword').val(),
29                     email:$('#id_email').val(),
30                     csrfmiddlewaretoken:$("[name='csrfmiddlewaretoken']").val()
31                 },
32                 success:function (res) {
33                     if(res.user){
34                         location.href='/login/'
35                     }
36                     else{
37                         //清除錯誤
38                         $('.error').html('');
39                         $('.form-control').removeClass('has-error');
40 
41                         //顯示新錯誤
42                         $.each(res.error,function (i,j) {
43                             if(i=='__all__'){
44                                 $('#id_rpassword').next().html(j[0])
45                             }
46                             $('#id_'+i).next().html(j[0]).css('color','red').parent().addClass('has-error')
47                     });
48                     }
49 
50                     console.log(res)
51                 }
52             })
53         })
54     })
55 </script>
56 </body>