2015-01-30 1 views
0
3.4

장고, 재활용 가능한 Ajax HttpResponse에는 JSON

이 코드는 '같은'에 관한 것입니다

장고 1.7.2/Python을 보내지 않습니다. 사용자가 '좋아요'버튼을 클릭하면 아약스는 'pushLike'를 호출합니다. 사용자가 전에 기사를 좋아한다면 (MySQL에 저장), 테이블 (DB)의 행을 삭제하십시오. 또는 사용자가 기사를 좋아하지 않으면 행을 만들어 테이블 (DB)에 삽입하십시오.

그 후에 얼마나 많은 기사를 클릭했는지 계산합니다. likeCnt (count)를 ajax에 전달하고 버튼에 씁니다.

likeCnt에는 올바른 값이 있습니다 (서버 mysql 테이블에서 확인). 단추 색이 바뀌지 만 (흰색에서 파란색으로 및 그 반대로) 텍스트는 변경되지 않습니다. json이 아약스에게 전달하지 않은 것처럼 보입니다. 나는 '텍스트'유형으로 데이터를 전달하려고 시도했지만 효과가 있었지만 json이 원한다.

나는 simplejson, json, mimetype, content_type을 HttpResponse에서 시도했다.

도와주세요.

보기

@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') 

자바 스크립트

<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> 

답변

0

당신이 당신의 HttpResponse에에 적절한 MIME 형식을 설정해야 할 것이다

@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"}) 

그래도 문제가 해결되지 않으면 Jsonery 코드로 json을 구문 분석 해봤습니까?
예 :

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

자바 스크립트가 실제로 다시, 당신은 실제로 JSON과 같은 문자열을 얻고 다시 JSON을 ... 당신의 장고 응용 프로그램을 제공하므로 대신지고 어떤 바이트를 수신 할 수도 있습니다. http://api.jquery.com/jquery.parsejson/

+0

답해 주셔서 감사합니다. 위의 모든 시도했지만 작동하지 않습니다. 지금 문자열을 사용하여 데이터를 전달 중입니다 ... –

+0

HttpResponse에서 어떤 데이터 유형을 수신합니까? 'console.log (데이터 타입)' –

+0

왜 그런지는 모르겠지만 지금은 작동합니다 !! 제안한 첫 번째 방법을 사용했습니다. 고맙습니다. btw, 데이터 형식이 '정의되지 않음' 무엇입니까? –