[Django系列]11.Django表单注册验证,错误信息和自定义验证

Django提供了一种动态过程,先从模板里面对变量赋值,然后渲染成为html标签,下面将通过例子进行演示.
1.将模板的标签替换成django的form表单
  • 只渲染html中form便签其中元素的一部分,不渲染提交等标签.
#login.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>
<center>
<form method="post">
    {% csrf_token %}
{#    用户名:<input type="text" name="username" placeholder="请输入用户名"/></br> #}      #注释原来的代码
{#    密码:  <input type="password" name="password" placeholder="请输入密码"/></br> #}     #注释原来的代码
​
    {{ form_t }}      #替换django的form表单
​
    <input type="submit" value="提交"/></form>
</center>
</body>
</html>

2.使用django内置模块创建forms模型

跟数据库models一样,需要从django导入模块forms,并继承forms.Form模块
#day14/douban/forms.py
from django import formsclass LoginForm(forms.Form):
    username=forms.CharField()
    password=forms.CharField()

3.添加login方法到views.py

  • 注意导入LoginForm
  • 使用form_v=LoginForm()实例化表单的对象,并作为上下文参数传入html模板
# -*- coding: utf-8 -*-
from __future__ import unicode_literalsfrom django.shortcuts import render,HttpResponse,HttpResponseRedirect,reverse
from models import UserModel
import uuid
from .forms import LoginForm   #要使用表单模型需要事先导入
# Create your views here.
def index(request):
    mysessionid=request.COOKIES.get('mysessionid')
    username=request.session.get(mysessionid)
    if username:
        return HttpResponse("欢迎来到%s的博客!"%username)
    else:
        return HttpResponseRedirect(reverse('login_page'))
​
def login(request):
    if request.method=="GET":
        form_v=LoginForm()   #这里直接使用LoginForm模型表单
        return render(request,'login.html',{'form_t':form_v})  #通过上下文传变量给html模板标签的变量form_t
    else:
        username=request.POST.get('username',None)
        password=request.POST.get('password',None)
        userModel=UserModel.objects.filter(username=username,password=password).first()
        if userModel:
            response=HttpResponseRedirect(reverse('index_page'))
            mysessionid=str(uuid.uuid4())
            response.set_cookie('mysessionid',mysessionid)
            request.session[mysessionid]=userModel.username
            return response
        else:
            return HttpResponse("用户名和密码错误")
配置完成后,使用get请求form模型渲染出来的效果

可以修改模板标签{{ form_t.as_p }}或者{{ form_t.as_ul }} 可以变成纵向排列

4.使用form模型的控件widget

注意到form直接渲染出来的表单,密码是可见的,不符合日常要求

于是就需要使用到form模型的控件widget,密码部分只需要使用widget=forms.PasswordInput这个控件即可,PasswordInput实质上是一个class对象,实现原理是将input_type变成password标签.
from django import forms
class LoginForm(forms.Form):
    username=forms.CharField()
    password=forms.CharField(widget=forms.PasswordInput)

如果需要使用输入框的提示,可以修改PasswordInput里面传参attrs字典,该操作会影响服务器性能
username=forms.CharField(widget=forms.PasswordInput(attrs={'placeholder':u'请输入用户名'}))
password=forms.CharField(widget=forms.PasswordInput(attrs={'placeholder':u'请输入密码'}))

5.写一个注册页面register.html

用变量{{ form_t.as_p }}接收表单

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册页面</title>
</head>
<body>
<form method="post">
    {% csrf_token %}
    {{ form_t.as_p }}
    <input type="submit" value="注册"/>
</form>
</body>
</html>
增加一个form模型对象,增加RegisterForm,实现登陆表单的username,password,password_repeat,email的字段接收
#-*- coding:utf-8 -*-
from django import forms
class LoginForm(forms.Form):
    username=forms.CharField()
    password=forms.CharField(widget=forms.PasswordInput(attrs={'placeholder':u'请输入密码'}))
​
class RegisterForm(forms.Form):
    username=forms.CharField()
    password=forms.CharField(widget=forms.PasswordInput(attrs={'placeholder':u'请输入密码'}))
    password_repeat=forms.CharField(widget=forms.PasswordInput(attrs={'placeholder':u'请输入密码'}))
    email=forms.EmailField()
增加一个注册操作的视图函数register
  • form_v=RegisterForm(request.POST)是将request.POST这个字典对象,整体传给RegisterForm进行对应变量传值
# -*- coding: utf-8 -*-
from __future__ import unicode_literalsfrom django.shortcuts import render,HttpResponse,HttpResponseRedirect,reverse
from models import UserModel
import uuid
from .forms import LoginForm,RegisterFormdef register(request):
    if request.method=="GET":
        form_v=RegisterForm()
        return render(request,'register.html',{'form_t':form_v})
    else:
        form_v=RegisterForm(request.POST)
        if form_v.is_valid():
            print form_v.is_valid()
            return HttpResponse(u'注册成功')
        else:
            return HttpResponse(u'注册失败')
增加一条路由指向注册页面register的视图函数.
url(r'^register/$',views.register,name='register_page'),

6.django表单错误信息的提示

使用成员方法form.errors ,当出现错误时,显示到前台,
修改对应模块register.html,forms.py部分内容
#register.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册页面</title>
</head>
<body>
<form method="post">
    {% csrf_token %}
    {{ form_t.as_p }}
    <input type="submit" value="注册"/>
</form>
​
{{ errors }}    {#  增加标签errors用以显示错误信息  #}
</body>
</html>
增加一个errors的上下传参
#forms.py
def register(request):
    if request.method=="GET":
        form_v=RegisterForm()
        return render(request,'register.html',{'form_t':form_v})
    else:
        form_v=RegisterForm(request.POST)
        if form_v.is_valid():
            print form_v.is_valid()
            return HttpResponse(u'注册成功')
        else:
            return render(request,'register.html',{'form_t':form_v,'errors':form_v.errors}) #使用errors标签渲染到前台

自定义错误信息,在foms里面使用参数error_messages={关键字参数名字:错误提示} 实现
#例如需要密码最小长度为6
password=forms.CharField(max_length=8,min_length=6,
            error_messages={'min_length':u'密码最小长度为6'},
            widget=forms.PasswordInput(attrs={'placeholder':u'请输入密码'}))

7.使用django的form校验

重写form模型clean方法,实现最小密码的校验,使用forms.ValidationError 方法产生异常
class RegisterForm(forms.Form):
    username=forms.CharField(max_length=8,)
    password=forms.CharField(max_length=8,#min_length=6,
            #error_messages={'max_length':u'密码最小长度为6'},
            widget=forms.PasswordInput(attrs={'placeholder':u'请输入密码'}))
    password_repeat=forms.CharField(widget=forms.PasswordInput(attrs={'placeholder':u'请输入密码'}))
    email=forms.EmailField()
​
    def clean_password(self):      #增加方法clean_password
        password=self.cleaned_data.get('password')
        if len(password)<6:
            raise forms.ValidationError(u'密码长度应大于6位') #使用forms.ValidationError 方法产生异常,参数为异常的显示内容

如果需要进行2次密码校验,可以这么写
#forms.py
    def clean(self):
        password=self.cleaned_data.get('password')
        password_repeat=self.cleaned_data.get('password_repeat')
        if password != password_repeat:
            raise forms.ValidationError(u'两次输入密码不正确')

但是上述提示显示的位置,不能反映出是哪一个字段的错误信息,所以可以通过使用self.add_error() 方法来讲错误信息的精确定位提示
self.add_error('password_repeat',u'两次密码不相等')

总结

Django提供了渲染的方法,是一种动态过程,性能会低一些,如果追求高性能的话,最好使用前端方法实现,不要太依赖后端,因为每次都需要从模板里面对变量赋值,然后渲染成为html标签,当量大的时候,对服务器是一种负担.
在使用Django的错误提示时,可以使用定义的字段参数定义,也可以重新定义方法实现.且实现的功能也比较强大.但从性能最佳的角度来看,不建议过多使用后台的这些功能,这部分校验完全可以由前台实现.
赞(0) 打赏
未经允许不得转载:http://www.yueguangzu.net逗逗网 » [Django系列]11.Django表单注册验证,错误信息和自定义验证
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏