注册
通过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 >
<img id="previewIMG" src="/static/imgs/default.png" alt="头像" >
{# <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 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})