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
模块
from django import forms
class LoginForm(forms.Form):
username=forms.CharField()
password=forms.CharField()
3.添加login方法到views.py
-
注意导入LoginForm
-
使用form_v=LoginForm()
实例化表单的对象,并作为上下文参数传入html模板
from __future__ import unicode_literals
from django.shortcuts import render,HttpResponse,HttpResponseRedirect,reverse
from models import UserModel
import uuid
from .forms import LoginForm
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()
return render(request,'login.html',{'form_t':form_v})
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的字段接收
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进行对应变量传值
from __future__ import unicode_literals
from django.shortcuts import render,HttpResponse,HttpResponseRedirect,reverse
from models import UserModel
import uuid
from .forms import LoginForm,RegisterForm
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 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的上下传参
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})

自定义错误信息,在foms里面使用参数error_messages={关键字参数名字:错误提示}
实现
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,
widget=forms.PasswordInput(attrs={'placeholder':u'请输入密码'}))
password_repeat=forms.CharField(widget=forms.PasswordInput(attrs={'placeholder':u'请输入密码'}))
email=forms.EmailField()
def clean_password(self):
password=self.cleaned_data.get('password')
if len(password)<6:
raise forms.ValidationError(u'密码长度应大于6位')

如果需要进行2次密码校验,可以这么写
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的错误提示时,可以使用定义的字段参数定义,也可以重新定义方法实现.且实现的功能也比较强大.但从性能最佳的角度来看,不建议过多使用后台的这些功能,这部分校验完全可以由前台实现.
最新评论