Что может вызвать ошибку 500 в HttpResponse для вызова AJAX?

-2

EDIT изменения мэра были внесены в вопрос и текст, чтобы было ясно. Как оказалось, ошибка вызвана очень глупой ошибкой, которая заключается в том, что я забыл импортировать HttpResponse в мои views.py. Поскольку в тех же view.py я обрабатываю другое представление, я предположил, что он был импортирован. Ошибка новичков. :(

Вопрос: Я пытаюсь отправить вверх или вниз голосов через ajax. По-видимому, большая часть кода в моем представлении выполняется, а затем при возврате ответа он терпит неудачу. Проблема в том, что ошибки django не отображаются; единственная информация, которую я получаю в терминале, такова: "POST/c/vote/HTTP/1.1" 500 10814. Где /c/vote / - это URL, который должен обрабатывать голоса.

Консоль в Chrome тоже не помогает. Ошибка, которую я получаю: "Не удалось загрузить ресурс: сервер ответил со статусом 500 (INTERNAL SERVER ERROR)", тогда, если я нажму ссылку, я перенаправлен на /c/vote/, где django возвращает 404. Примечание я голосование в другом URL-адресе (т.е. /c/<country>/)

Я узнал, что голоса фактически сохраняются или удаляются, поэтому проблема может возникать при возврате ответа.

Мой шаблон (пользовательские теги шаблона, чтобы узнать, проголосовал ли пользователь раньше):

<div class="vote_buttons" x:id="{{linkpost.pk}}">
    <a href="#" class="upVote{% if linkpost|is_up_voted_by:user %} voted{%endif%}" x:value="1" ></a>
    <a href="#" class="downVote{% if linkpost|is_down_voted_by:user %} voted{%endif%}" x:value="-1"></a>

Код js (я использую JQuery). Переменная {{vote_url}} передается с тегом шаблона:

<script type="text/javascript">
    $(document).ready(function() {
        $(".vote_buttons").bind("vote", function(event, value) {
            var vote_el = $(this);
            $.ajax({
                    type:'POST',
                url: '{{ vote_url }}',
                data: {

                    'pk': vote_el.attr("x:id"),
                    'delta': value
                },
                dataType: "json",
        success : function(data, textStatus, jqXHR) {
                    switch (data.voted_as) {
                        case 1:
                            vote_el.find("a.upVote").addClass("voted");
                            vote_el.find("a.downVote").removeClass("voted");
                       break;
                        case -1:
                            vote_el.find("a.upVote").removeClass("voted");
                            vote_el.find("a.downVote").addClass("voted");
                       break;
                    }
                },
            });
        });
        $('.upVote, .downVote').click(function(){
            $(this).parent().trigger("vote", $(this).attr("x:value"));
            return false;
        });
    });
</script>

И, наконец, взгляд. Я добавил некоторые заявления для печати, чтобы выяснить, где это происходит. Благодаря @Steven код выполняет весь путь до шага 12. Затем возникает вышеупомянутая ошибка.

def vote(request):
    """
    Likes or dislikes a linkpost.
    """
    print "Setp 1 ok!"
    #User must be authenticated to vote.
    if request.is_ajax():
        print "Step 2 ok"
        if request.method == 'POST' and request.user.is_authenticated():
            print "Step 3 ok"
            delta = request.POST['delta']
            # In case an error occurrs with delta value
            try:
                delta = int(delta)
                print "Step 4 ok"
            except ValueError:
                print "Error was value error"
                return HttpResponse("{'success': 'false'}")

            # You can only vote upwards or downwards    
            if not delta in (1, -1):
                print "Error was in delta"
                return HttpResponse("{'success': 'false'}")
            print "Step 5 ok"
            #We check if the linkpost actually exists!
            LinkPost = get_model('company', 'LinkPost')
            try:
                linkpost = LinkPost.objects.get(pk=request.POST['pk'])
                print "Step 6 ok"
            except LinkPost.DoesNotExist:
                print "Link object does not exist"
                return HttpResponse("{'success': 'false'}")

            #We check if the user voted before.
            Vote = get_model('company', 'Vote')
            try:
                vote = Vote.objects.get(linkpost = linkpost, listener = request.user)
                print "Step 7 ok!" 
            except Vote.DoesNotExist:
                print "Vote doesn't exists!" 
                vote = None

            # If there is already a vote
            if vote:

                print "Step 8."
                if vote.delta == delta:
                    vote.delete()
                else:
                    print "Step 9."
                    vote.delta = delta
                    vote.save()

            #There wasn't a vote, we create one.
            else:
                print "Step 10."
                Vote.objects.create(linkpost = linkpost,
                                           listener = request.user,
                                           delta = request.POST['delta'])

            response_dict = {'success' : 'true', 'voted_as': delta}          
            print "Step 12."    
            return HttpResponse(simplejson.dumps(response_dict), mimetype="application/json")
        else:
            print "User not authenticated"
            raise Http404('What are you doing here?')
    else:
        print "Request isn't ajax"
        raise Http404('What are you doing here?')

Любая помощь в выяснении проблемы будет высоко оценена! Если вопрос остается неясным, я попытаюсь уточнить или добавить как можно больше информации!

  • 1
    В чем ошибка?
  • 0
    Я не вижу, куда вы передаете переменную {{ vote_url }} в шаблон. Ваш Ajax-запрос правильно адресован?
Показать ещё 5 комментариев
Теги:

1 ответ

0
Лучший ответ

Пытаться:

response_dict = "{'success' : 'true', 'voted_as': '%s'}" % (delta)

У вас есть посторонний s после оператора% в вашем коде. Он должен быть % (delta)

Кроме того, вы обнаружите, что вы можете увидеть информационную страницу ошибок Django в инструментах разработчика вашего браузера (см. Раздел "Сеть"), если у вас установлен DEBUG = True. Форматирование может быть отключено, но оно все равно поможет вам быстрее получить ошибки кода.


Изменение: OP fixed typo подробно описана ниже:

Если это не опечатка в вашем вопросе: except Vote.DoesNotExists:

то вам может быть больше повезло:

except Vote.DoesNotExist:
  • 0
    Привет, хороший глаз. Очевидно, это была не майская проблема, но это помогло выяснить, что большая часть кода выполнялась. Thnks!
  • 0
    Спасибо, это действительно очень помогло. Код теперь выполняется вплоть до шага 12! Я обновляю вопрос, так как считаю, что проблема в том, что после возвращения HttpResponse код JS не может определить, какие элементы css нужно изменить. Возможно, мне нужно вернуть больше информации в словаре или изменить JS.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню