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?')
Любая помощь в выяснении проблемы будет высоко оценена! Если вопрос остается неясным, я попытаюсь уточнить или добавить как можно больше информации!
Пытаться:
response_dict = "{'success' : 'true', 'voted_as': '%s'}" % (delta)
У вас есть посторонний s после оператора% в вашем коде. Он должен быть % (delta)
Кроме того, вы обнаружите, что вы можете увидеть информационную страницу ошибок Django в инструментах разработчика вашего браузера (см. Раздел "Сеть"), если у вас установлен DEBUG = True. Форматирование может быть отключено, но оно все равно поможет вам быстрее получить ошибки кода.
Изменение: OP fixed typo подробно описана ниже:
Если это не опечатка в вашем вопросе: except Vote.DoesNotExists:
то вам может быть больше повезло:
except Vote.DoesNotExist:
{{ vote_url }}
в шаблон. Ваш Ajax-запрос правильно адресован?