当我们在使用Django Form的时候 , Django默认的Required,max_length,min_length等只提供了基本需求,但满足不了其它验证需求: 比如说注册的时候 密码和确认密码是否相同,登陆时用户名和密码是否正确等等
下面给出了一个简单的登录验证功能:
from django.shortcuts import render
from django.http import HttpResponse
from django.core.exceptions import ValidationError
from django import forms
from Default.models import Users
# Create your views here
#Define Login form
class sign_in_form(forms.Form):
email=forms.EmailField(required=True,error_messages={'required':u'邮箱不能为空','invalid':u'请输入正确的邮箱'})
password=forms.CharField(required=True,error_messages={'required':u'密码不能为空','invalid':u'请输入正确的邮箱'})
remember=forms.BooleanField()
#验证模块
def clean(self):
#获取表单数据
cleaned_data=self.cleaned_data
#最好使用cleaned_data.get("email")替代cleaned_data["email"] 这样当传入空值 就不会报错
data_email=cleaned_data.get("email")
data_password=cleaned_data.get("password")
if data_email:
is_exist=Users.objects.filter(email=data_email,password=data_password).exists()
if not is_exist:
self._errors['password'] = self.error_class([u"用户名或密码错误!"])
#无论做了什么验证 data始终要传回去,否则就失去form data了
return cleaned_data
登录方法体:
def login(req):
if req.method == 'POST':
form=sign_in_form(req.POST)
print(form)
if form.is_valid():
return index(req)
else:
return render(req,'signin.html',{'form':form})
else:
return render(req, 'signin.html')
前端Html代码:
<div class="box">
<form method="post" id="form">
<div class="content-wrap">
<h6>Sign Up</h6>
<input class="span12" name="email" type="text" value="{{form.email.value}}" placeholder="E-mail address" />
<input class="span12" name="password1" type="password" placeholder="Password" />
<input class="span12" name="password2" type="password" placeholder="Confirm Password"/>
<div id="error_div">
<!--遍历传回表单数据中,将其中的错误信息显示出来-->
{%for field in form%}
{{field.errors}}
{%endfor%}
</div>
<div class="action">
<input type="submit" class="btn-glow primary signup" value="Sign up"></input>
</div>
</div>
</form>
</div>