通過forms來創建用戶註冊
阿新 • • 發佈:2018-04-10
form註冊
通過django的Form來生成標簽
form主要是可以保存數據,也可以生成標簽,對於登錄和註冊來說使用方便
下面創建了forms.py模塊,然後倒入這個模塊到views裏面,這樣是為了後面的好管理,代碼的整潔
from django.forms import Form from django.forms import fields,widgets from django.core.exceptions import ValidationError class RegisterForm(Form): username = fields.CharField( widget=widgets.TextInput(attrs={‘class‘:"form-control",‘placeholder‘:"用戶名",‘name‘:"user"}) ) password1 = fields.CharField( widget=widgets.TextInput(attrs={‘class‘:"form-control",‘placeholder‘:"密碼",‘name‘:"pwd1"}) ) password2 = fields.CharField( widget=widgets.TextInput(attrs={‘class‘:"form-control",‘placeholder‘:"確認密碼",‘name‘:"pwd2"}) ) avatar = fields.FileField( widget=widgets.FileInput(attrs={‘class‘:‘f1‘,‘id‘:‘previewIMG‘}) ) code = fields.CharField( widget=widgets.TextInput(attrs={‘class‘: "form-control", ‘placeholder‘: "驗證碼", ‘name‘: "code"}) )
views裏面的代碼是:
def register(request):
from utils.forms import RegisterForm
obj = RegisterForm()
if request.method == "GET":
return render(request,‘register.html‘,{‘obj‘:obj})
前端頁面代碼
<div class="login"> <form class="form-horizontal" method="post" action="/register/" enctype="multipart/form-data"> <div style="width: 80px;height: 80px;position: relative;"> <img id="previewIMG" src="/static/imgs/default.png" alt="頭像" style="width: 80px;height: 80px;"> {# <input type="file" id="Imgfile" class="f1">#} {{ obj.avatar }} </div> <br> <div class="form-group"> <label class="col-sm-2 control-label">用戶名</label> <div class="col-sm-10"> {# <input type="text" class="form-control" placeholder="用戶名" name="user">#} {{ obj.username }} </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">密碼</label> <div class="col-sm-10"> {# <input type="password" class="form-control" placeholder="密碼" name="pwd1">#} {{ obj.password1 }} </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">確認密碼</label> <div class="col-sm-10"> {# <i?nput type="password" class="form-control" placeholder="確認密碼" name="pwd2">#} {{ obj.password2 }} </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">驗證碼</label> <div class="col-sm-5"> <input type="text" class="form-control" placeholder="驗證碼" name="code"> </div> <div class="col-sm-5"> <img style="width: 120px;height: 30px;" src="/check_code/"> </div> </div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> <div class="checkbox"> <label> <input type="checkbox"> Remember me </label> </div> </div> </div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> <input type="submit" class="btn btn-default btn_color" value="登陸"> </div> </div> </form> </div>
form的驗證
我們這到form的功能有is_vaild來驗證的功能,這裏我們需要驗證code(驗證碼),兩次輸入的密碼
- 我們可以通過後端request來一點一點都取出來,然後做對比
- 我們可以通過request裏面自帶的信息來對比,但是form傳入的時候是沒有request信息的,這裏就需要我們手動來修改類函數
code驗證不是正則,我們可以從session裏面來獲得,在form裏面我們可以從is_vaild可以查到,可以自定義方法通過clean_xx xx為Form字段
所以,我們在form裏面手動來定義一個字段
forms.py裏面 代碼
#在views裏面執行RegisterForm()是執行這個類裏面的方法,如果這個裏面沒有回執行父類Form裏面的構造方法。所以這裏可以自己定義一個構造方法,如下: def __init__(self,request,*args,**kwargs): super(RegisterForm,self).__init__(*args,**kwargs) self.request = request #這樣在view裏面就可以給RegisterForm傳request這個參數了 def clean_code(self): code = self.cleaned_data[‘code‘]#這個要和request裏面的session的code來對比驗證
通過上面的配置在views裏面引用的時候就可以傳入參數request
這樣通過request就可以去裏面取session值了,如下
def clean_code(self):
input_code = self.cleaned_data[‘code‘]#這個要和request裏面的session的code來對比驗證
session_code = self.request.session.get(‘code‘)
if input_code.upper() == session_code.upper():
return input_code
raise ValidationError(‘驗證碼錯誤‘)#這個是返回給code字段
密碼驗證對比
#下面這個方法,對上面字段password1和2的位置是有要求的,如果password2是現在1的上面,下面是沒有值取到來對比的
"""
def clean_password2(self):
p1 = self.cleaned_data[‘password1‘]
p2 = self.cleaned_data[‘password2‘]
return p2
"""
"""
針對上面的問題,可以使用clean方法,執行到這裏的,所有該取到值都取到了
"""
def clean(self):
# p1 = self.cleaned_data[‘password1‘]
# p2 = self.cleaned_data[‘password2‘]
p1 = self.cleaned_data.get(‘password1‘)#以防上面有出錯的地方,我們這裏可以使用get方法
p2 = self.cleaned_data.get(‘password2‘)#以防上面有出錯的地方,我們這裏可以使用get方法
if p1 == p2:
# return self.cleaned_data #return None 這返回不返回都是可以的
return None #return None 這返回不返回都是可以的
else:
self.add_error(None,ValidationError(‘密碼不一致‘))#clean方法裏面,這裏的這個錯誤是放在了__all__裏面,註意:後端直接obj.errors[__all__}或者obj.errors[NON_FIELD_ERRORS]就可以了。前端是不能這麽取的,
# 前端是{{obj.non_filed_errors}}來獲取,這是form中的clean的錯誤返回獲取的方式
當然也可以指定key,後端通過key來獲取:
self.add_error("password2", ValidationError(‘密碼不一直‘))
參考博客:https://www.cnblogs.com/liuzhipenglove/p/8012045.html
form全部代碼
from django.forms import Form
from django.forms import fields,widgets
from django.core.exceptions import ValidationError
class RegisterForm(Form):
username = fields.CharField(
widget=widgets.TextInput(attrs={‘class‘:"form-control",‘placeholder‘:"用戶名",‘name‘:"user"})
)
password1 = fields.CharField(
widget=widgets.PasswordInput(attrs={‘class‘:"form-control",‘placeholder‘:"密碼",‘name‘:"pwd1"})
)
password2 = fields.CharField(
widget=widgets.PasswordInput(attrs={‘class‘:"form-control",‘placeholder‘:"確認密碼",‘name‘:"pwd2"})
)
avatar = fields.FileField(
widget=widgets.FileInput(attrs={‘class‘:‘f1‘,‘id‘:‘Imgfile‘})
)
code = fields.CharField(
widget=widgets.TextInput(attrs={‘class‘: "form-control", ‘placeholder‘: "驗證碼", ‘name‘: "code"})
)
#在views裏面執行RegisterForm()是執行這個類裏面的方法,如果這個裏面沒有回執行父類Form裏面的構造方法。所以這裏可以自己定義一個構造方法,如下:
def __init__(self,request,*args,**kwargs):
super(RegisterForm,self).__init__(*args,**kwargs)
self.request = request #這樣在view裏面就可以給RegisterForm傳request這個參數了
def clean_code(self):
input_code = self.cleaned_data[‘code‘]#這個要和request裏面的session的code來對比驗證
session_code = self.request.session.get(‘code‘)
if input_code.upper() == session_code.upper():
return input_code
raise ValidationError(‘驗證碼錯誤‘)#這個是返回給code字段
def clean_password1(self):
pass
#下面這個方法,對上面字段password1和2的位置是有要求的,如果password2是現在1的上面,下面是沒有值取到來對比的
# """
# def clean_password2(self):
# p1 = self.cleaned_data[‘password1‘]
# p2 = self.cleaned_data[‘password2‘]
# return p2
# """
# """
# 針對上面的問題,可以使用clean方法,執行到這裏的,所有該取到值都取到了
# """
def clean(self):
# p1 = self.cleaned_data[‘password1‘]
# p2 = self.cleaned_data[‘password2‘]
p1 = self.cleaned_data.get(‘password1‘)#以防上面有出錯的地方,我們這裏可以使用get方法
p2 = self.cleaned_data.get(‘password2‘)#以防上面有出錯的地方,我們這裏可以使用get方法
if p1 == p2:
# return self.cleaned_data #return None 這返回不返回都是可以的
return None #return None 這返回不返回都是可以的
else:
self.add_error(None,ValidationError(‘密碼不一致‘))
# self.add_error("password2", ValidationError(‘密碼不一直‘))#clean方法裏面,這裏的這個錯誤是放在了__all__裏面,註意:後端直接obj.errors[__all__}或者obj.errors[NON_FIELD_ERRORS]就可以了。前端是不能這麽取的,
# 前端是{{obj.non_filed_errors}}來獲取,這是form中的clean的錯誤返回獲取的方式
view全部代碼
from django.core.exceptions import NON_FIELD_ERRORS
def register(request):
from utils.forms import RegisterForm
obj = RegisterForm(request)
if request.method == "GET":
return render(request,‘register.html‘,{‘obj‘:obj})
else:
obj = RegisterForm(request,request.POST,request.FILES)
if obj.is_valid():
pass
else:
print(obj.errors)
return render(request, ‘register.html‘, {‘obj‘: obj})
通過forms來創建用戶註冊