django中ajax异步表单验证与传输返回json的实现

在django中实现要有提交表单的相关操作,但是这里又不想刷新页面的话就需要用到ajax来实现。ajax前端用jQuery的框架很简单,后端在django中包括表单的验证都有很好的封装。
以提交一篇日志的评论为例,前端的代码很简单:

$(".comment-form a").bind("click",function(){
   $('.loading').fadeIn();
   var comment_form = {
   blogid : ...,
   name : ...,
   email : ...,
   website : ...,
   message : ...
   }
   $.ajax({
   url : "/blog/setComment/",
   data : comment_form,
   type : "post",
   somethinguccess : function(data){
   data = JSON.parse(data);
   if(data.code == 0){
   //do something to handle error log
   }
   else{
   //do something to handle success
   }
   $('.loading').fadeOut();
   }
   })
});

在django的view中首先要引入

import datetime
from django import forms
from django.utils import simplejson as json

forms用作表单的验证处理,simplejson用作对返回数据的json格式化
这里不用js经行验证是因为用户有可能在浏览器端禁用js或者用大量的恶意数据来进行攻击,所以要在服务器端来进行表单的验证。这里建立一个form表单验证的表单类

class CommentForm(forms.Form):
blogid = forms.IntegerField()
name = forms.CharField(required=True)
email = forms.EmailField(required=True)
website = forms.URLField(required=False)
message = forms.CharField(required=True)

这里的其他表单验证属性还请自行google
然后再定义post的setComment

def setComment(request):
if request.is_ajax():
form = CommentForm(request.POST)
if form.is_valid():
p = Comment(blogid=request.POST.get('blogid'),name=request.POST.get('name'),email=request.POST.get('email'),website=request.POST.get('website'),content=request.POST.get('message'),date=datetime.datetime.now())
p.save()
return HttpResponse(json.dumps({"code":1,"message":{"name":request.POST.get('name'),"message":request.POST.get('message')}}))
else:
return HttpResponse(json.dumps({"code":0,"message":[{"name":"name","error":form['name'].errors},{"name":"email","error":form['email'].errors},{"name":"website","error":form['website'].errors},{"name":"message","error":form['message'].errors}]}))

首先判断request的类型是否为ajax,然后定义表单验证的类并经行验证,验证成功保存到数据库并返回成功的数据,验证错误返回错误信息