AJAX как вызвать ошибку $ ajax (): функция из django - PullRequest
0 голосов
/ 20 июня 2020

Я новичок в веб-разработке. Я пытаюсь создать веб-сайт, на котором есть модуль комментариев, где пользователь может лайкать комментарий и обновлять общее количество голосов, используя ajax. Но почему-то функция ajax error не вызывается даже при ошибке. только функция успеха вызывается несмотря ни на что. Я не знаю, как заставить его работать

вот ajax код:

function upvotecomment(postid, commentid, votes_total){

$('#upvotingcmt').one('submit', function(event){
  event.preventDefault();
  console.log(event)
  console.log("form submitted!")  // sanity check
  upvotingcomment(postid, commentid, votes_total);
});
}

function upvotingcomment(postid, commentid, votes_total) {
    $.ajax({
        url : "upvotecomment/"+postid+"/"+commentid, // the endpoint
        type : "POST", // http method

        // handle a successful response
        success : function(json) {
            votes_total += 1;
            console.log(json); // log the returned json to the console
            $('#totalupvotes').text(votes_total);
            console.log("success"); // another sanity check
        },

        // handle a non-successful response
        error : function(xhr,errmsg,err) {
            console.log('error');
            console.log(xhr.status + ": " + xhr.responseText); // provide a bit more info about the 
            error to the console
        }
    });
};

вот Django функция просмотра:

@login_required(login_url="/accounts/signup")
def upvotecomment(request, post_id, comment_id):
    if request.method == 'POST':
        post = get_object_or_404(Post, pk = post_id)
        comment = get_object_or_404(Comment, pk = comment_id)
        response_data = {}
        if comment.user.username == request.user.username:
            messages.error(request, "Commenter can't upvote their own comment !")
            return redirect('creators')  
        else:
            try:
                vote = Commentvote.objects.get(commentID=comment, postID=post, userID=request.user)
                messages.error(request, 'You have already voted for this comment!')
                return redirect('creators')
            except Commentvote.DoesNotExist:
                vote = None
                # find product by id and increment
                post = Post.objects.get(id=post_id)
                # find comment by id and increment
                comment = Comment.objects.get(id=comment_id)
                vote = Commentvote(commentID=comment, postID=post, userID=request.user)
                comment.votes_total += 1
                vote.save()
                comment.save()

                response_data['result'] = 'upvoted successfully!'

                return HttpResponse(
                    json.dumps(response_data),
                    content_type="application/json"
                )
            else:
                return HttpResponse(
                    json.dumps({"nothing to see": "this isn't happening"}),
                    content_type="application/json"
                )    

I Я использую функцию ajax для обработки токена csrf, которая работает нормально.

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

Вам необходимо вернуть правильный status_code, чтобы вызвать error callback во внешнем интерфейсе, например

def upvotecomment(request):
    ...
    message: 'Permission denied'
    status_code = 403
    # JsonResponse is just a wrapper of HttpResponse, with context_type set to application/json and return a JSON-encoded response.
    return JsonResponse({'message':message }, status=status_code)
0 голосов
/ 20 июня 2020

Вернуть errorMessage для вывода в консоль разработчика

     error: function (jqXhr, textStatus, errorMessage) {
         // error callback
         console.log(errorMessage);
         }

Но это не причина, по которой он всегда не возвращает сообщения об ошибке. Это потому, что вызов jquery AJAX прошел успешно. Это то, что он определяет, и именно это. Итак, Django получает его, а функция, которую вы вызываете, работает через AJAX, поэтому я предлагаю скорее обработать предполагаемую ошибку в функции успеха, найдя что-то, что вы вернули из django. Также лучше работать с JSONResponse и возвращать dict. В диктате может быть ваш аргумент. Возможно, вы захотите вернуть http500 или http404, и это должно вывести его в вашей ajax функции ошибок

...