Django中使用jQuery做评论的无刷新提交

评论如果简单用表单来提交的话,每次做评论都得刷新页面。这样评论完又得重头翻才能找到自己的评论,效果非常不好,于是打算用jQuery来做评论的无刷新提交。实际上就是利用AJAX,将评论数据传到服务器,由服务器将处理后,将数据返回给浏览器,然后修改HTML代码,将评论显示出来。

 

Django中使用jQuery的AJAX操作,还可以参考这里

 

这是我的HTML代码

1 <div>
2     <span style="float:left;margin-top:10px;">
3         <textarea name="content" rows="7" id="commentContent" style="width:550px;height:auto"  value=""></textarea>
4     </span>
5     <span style="clear:both;float:left;margin-top:10px;">
6         <input type="submit" name="addComment" value="加上去" id="addComment"  style="font-size:12px;font-weight:bold;" title="加上去">
7     </span>
8 </div>

 

 

这是我的javascript代码

<script type="text/javascript" src="/static/js/jquery.min.js"></script>

<script type="text/javascript"> 
$(document).ready(function()
{
  $("#addComment").click(function(event)
  {
        add_comment();
    });
    
    function add_comment()
    {
        $.post("add_comment/",   //请求的url是“当前页面/add_comment/"
        {
            content:$("#commentContent").val(),
        },
        function(data)
        {
          if(data.status=="success")
          {
                $("#commentContent").val("");
                $("#comment-list").append(data.html);//追加html片段
          }
          else
          {
                alert(data.status);//提交失败,弹出提示。
          }
        },
        "json"
    );}
});
</script>

 

在urls.py中添加对AJAX请求url的处理函数的映射

1 urlpatterns += patterns('',
2     (r'^photos/(?P<user_id>\d*)/(?P<photo_id>\d*)/add_comment/$', 'views.ajax_addComment'),
3    #我这里是对照片进行评论
4 )

 

 

在views中添加处理函数

 1 @csrf_exempt #若没有csrf处理,服务器会返回403 forbidden错误
 2 def ajax_addComment(request, user_id, photo_id):
 3     if not request.is_ajax() or (request.method != 'POST'):
 4         return HttpResponse(json.dumps({"status":'error0'}))
 5          
 6     #只有登录用户,才可以操作
 7     if not request.user.is_authenticated():
 8         return HttpResponse(json.dumps({"status":'error1'}))
 9     
10     try:
11         content = (request.POST.get('content')).strip()
12         if content != '':
13             comment = Comment(photo_id=photo_id,author=request.user,content=content)
14             comment.save()#保存评论数据到数据库中
15 
16             t = get_template('comment_item.html')
17             html = t.render(Context({'comment':comment}))#对评论数据用comment_item.html这个模板进行渲染
18   except: 
19         return HttpResponse(json.dumps({'status': str(sys.exc_info()[0]) + str(sys.exc_info()[1])}))#返回异常信息,调试的时候可以用
20     
21     return HttpResponse(json.dumps({'status':'success','html':html}))

 

上面使用了session和CSRF中间件,需要在settings.py中的MIDDLEWARE_CLASSES,添加下面的代码。

1 MIDDLEWARE_CLASSES = (
2     'django.contrib.sessions.middleware.SessionMiddleware',
3     'django.middleware.csrf.CsrfViewMiddleware',
4     'django.middleware.csrf.CsrfResponseMiddleware',
5 )

 

还是用了django中的user授权app,需要在settings.py中的INSTALLED_APPS,添加下面的代码。

1 INSTALLED_APPS = (
2     'django.contrib.auth',
3     'django.contrib.sessions',
4 )

 

这是评论项的模板comment_item.html,里面的class是排版的需要,请自定义。

 1 <div class="comment-item" id="c_{{comment.id}}">
 2   <div class="fleft">
 3     <img title="{{comment.author.name}}" src="{{comment.author.avatar_src}}">
 4   </div>
 5 
 6   <div class="comment-text-wrapper">
 7     <div class="comment-head">
 8       <span>{{comment.date_posted}}</span>
 9       <span class="blue-link" style="margin-left:10px;">{{comment.author.name}}</span>
10     </div>
11     <div class="comment-text">
12       <span>{{comment.content}}</span>
13     </div>
14   </div>
15 </div>

 

 

 

posted @ 2012-04-26 17:50  NaN-Hax  阅读(2083)  评论(1编辑  收藏  举报