Django,Ajax-HttpResponse不发送json

时间:2015-01-30 07:28:17

标签: ajax json django httpresponse

Django 1.7.2 / python 3.4

此代码与'类似'。 如果用户点击'喜欢'按钮,ajax调用' pushLike'。 如果用户之前喜欢过该文章(保存在Mysql中),则删除表格(DB)上的行。 或者如果用户不喜欢文章,请创建一行并将其插入表格(DB)。

之后,计算点击该文章的人数。 我想将likeCnt(count)传递给ajax,并将其写在按钮上。

likeCnt具有正确的值(我在服务器mysql表上检查过它)。 按钮颜色确实改变(白色到蓝色,反之亦然),但文本不会改变。 似乎json没有传递给ajax。我尝试通过' text'传递数据。类型,它确实有效,但我希望它由json。

我在HttpResponse上尝试过simplejson,json,mimetype,content_type。

请帮帮我。

视图

@login_required
def pushLike(request):
    pk = request.GET['writing_id']
    try:
        la = LikeArticles.objects.get(user = User.objects.get(username=request.user.username), article_id=pk)
        if(la.is_like()):
            la.delete()
            likeCnt = LikeArticles.objects.filter(article_id=pk).count()
            FreeBoards.objects.filter(id=pk).update(like = likeCnt)
        else: #Never happens
            la.like = True
            la.save()
            likeCnt = LikeArticles.objects.filter(article_id=pk).count()
            FreeBoards.objects.filter(id=pk).update(like = likeCnt)


    except ObjectDoesNotExist:
        la = LikeArticles(user = User.objects.get(username=request.user.username),
                article = FreeBoards.objects.get(id=pk),
                like = True,
            )
        la.save()
        likeCnt = LikeArticles.objects.filter(article_id=pk).count()
        FreeBoards.objects.filter(id=pk).update(like = likeCnt)

    data = {'likeCnt': likeCnt}

    # return render(request, url, context)
    return HttpResponse(simplejson.dumps(data), mimetype='application/javascript')

的javascript

<script type="text/javascript">
  $(document).ready(function(){
    $('#btn-like').click(function(){
      var e = $('#btn-like').css('background-color');
      $.ajax({
      url : '/sle/freeboards/pushLike/',
      data : {'writing_id':{{writing_id}},
      },
      dataType : "json",
      success:function(data){
      alert(data.likeCnt);
        if(e == 'rgb(59, 89, 152)') {
          $('#btn-like').css('background-color', '#ffffff').css('color', '#000000');
          $('#btn-like').text(data.likeCnt);
        } else {
          $('#btn-like').css('background-color', '#3b5998').css('color', '#ffffff');
          $('#btn-like').text(data.likeCnt);
        }
      },
      failure: function(data){
        alert('fail!!')
      }
      });
    });
  });
</script>

1 个答案:

答案 0 :(得分:0)

您希望确保在HttpResponse中设置正确的mimetype

@login_required
def pushLike(request):
    ...
    # return json -- !!not javascript!!
    return HttpResponse(simplejson.dumps(...), mimetype="application/json")

- 或 -

@login_required
def pushLike(request):
    ...
    # return json -- !!not javascript!!
    return JsonResponse({"your": "context dictionary"})

如果这不起作用,您是否尝试使用Jquery代码解析json?
即:

$.ajax({
    ...
    success: function(data){
        var response = $.parseJSON(data);
        ...
    }
});

javascript实际上可能会从您为django应用程序提供的任何内容中回收字节...所以不是让JSON回来,而是实际上得到的字符串看起来像JSON。 http://api.jquery.com/jquery.parsejson/