這是form類表單,自定義的form表單,需要重寫鈎子函數
""" forms類表單 """ # 校驗密碼是否一致 from django.core.exceptions import ValidationError from django import forms class RegForm(forms.Form): username = forms.CharField( max_length=16, label='用戶名', label_suffix=":", # 后綴 error_messages={ "max_length": "用戶名最長16位", "required": "用戶名不能為空" }, widget=forms.widgets.TextInput( attrs={ "class": "form-control" } ) ) password = forms.CharField( min_length=6, label='密碼', widget=forms.widgets.PasswordInput( attrs={ "class": "form-control" }, render_value=True, #提交數據不把密碼清空 ), error_messages={ "min_length": "密碼至少六位數", "required": "密碼不能為空" } ) re_password = forms.CharField( min_length=6, label='確認密碼', widget=forms.widgets.PasswordInput( attrs={ "class": "form-control" } ), error_messages={ "min_length": "密碼至少六位數", "required": "密碼不能為空" } ) email = forms.EmailField( label='郵箱', widget=forms.widgets.EmailInput( attrs={ "class": "form-control" } ), error_messages={ "invalid": "郵箱格式不正確!", } ) # 重寫全局的鈎子函數,對確認密碼做校驗 def clean(self): password = self.cleaned_data.get("password") re_password = self.cleaned_data.get("re_password") if re_password and re_password != password: self.add_error("re_password",ValidationError("兩次密碼不一致")) else: return self.cleaned_data
在HTML里面應該這樣寫
<!DOCTYPE html> <html lang="en"> <head> {% load static %} <meta charset="UTF-8"> <title>歡迎注冊</title> <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}"> <link rel="stylesheet" href="{% static 'mystyle.css' %}"> </head> <body> <div class="container reg-form"> <div class="row"> <div class="col-md-6 col-md-offset-3"> <form novalidate action="/register/" method="post" class="form-horizontal" enctype="multipart/form-data"> {% csrf_token %} <div class="form-group"> <label class="col-sm-2 control-label" for="{{ form_obj.username.id_for_label }}"> {{ form_obj.username.label }} </label> <div class="col-sm-8"> {{ form_obj.username }} <span class="help-block">{{ form_obj.username.errors.0 }}</span> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label" for="{{ form_obj.password.id_for_label }}"> {{ form_obj.password.label }} </label> <div class="col-sm-8"> {{ form_obj.password }} <span class="help-block">{{ form_obj.password.errors.0 }}</span> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label" for="{{ form_obj.re_password.id_for_label }}"> {{ form_obj.re_password.label }} </label> <div class="col-sm-8"> {{ form_obj.re_password }} <span class="help-block">{{ form_obj.re_password.errors.0 }}</span> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label" for="{{ form_obj.email.id_for_label }}"> {{ form_obj.email.label }} </label> <div class="col-sm-8"> {{ form_obj.email }} <span class="help-block">{{ form_obj.email.errors.0 }}</span> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label" for="id_avatar"> 頭像 </label> <div class="col-sm-8"> <label for="id_avatar" id="id_avatar_lab"> <img id="id_avatar-img" src="{% static 'images/default.jpg' %}" alt=""> </label> <input type="file" name="avatar" id="id_avatar" style="display: none"> <span class="help-block"></span> </div> </div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> <button type="submit" class="btn btn-primary">注冊</button> </div> </div> </form> </div> </div> </div>
在視圖函數里面
1 def register(request): 2 if request.method == 'POST': 3 form_obj = forms.RegForm(request.POST) 4 # 檢驗 5 if form_obj.is_valid(): 6 # 檢驗通過 7 # 去數據庫創建一個新的用戶 8 # 刪除多余的字段 9 form_obj.cleaned_data.pop('re_password') 10 models.UserInfo.objects.create_user(**form_obj.cleaned_data) 11 else: 12 # 將錯誤的信息返回到注冊頁面 13 return render(request, 'register.html', {"form_obj": form_obj}) 14 form_obj = forms.RegForm() 15 return render(request, 'register.html', {"form_obj": form_obj})
form_obj.is_valid()的執行順序:
1. 先按照form類中定義的字段順序,依次校驗每一個字段(內置的校驗規則)
2. 每個字段先校驗內置的規則, 然后字校驗clean_開頭的規則
3. 整個for循環走完之后, 再調用form類中定義的clean()方法
即可完成校驗兩次密碼是否一致的功能