#python #djan&o
#python #djan&o
Вопрос:
Я создаю приложение polls в первом руководстве по Djan&o. Я вижу, что каждый раз, когда вы голосуете, страница обновляется и переходит в начало страницы, я хочу, чтобы она просто оставалась там, где она есть, и обновляла только тег абзаца. detail.html:
<html dir="rtl"&&t;
<h1&&t;{{ article.title }}</h1&&t;
<h2&&t;{{ article.author }}</h2&&t;
<h1&&t;{{ article.text }}</h1&&t;
<p&&t;I have {{article.votes}}</p&&t;
{% if error_messa&e %}<p&&t;<stron&&&t;{{ error_messa&e }}</stron&&&t;</p&&t;{% endif %}
<form action="{% url 'main:vote' article.id %}" method="post"&&t;
{% csrf_token %}
<input type="submit" value="Vote"&&t;
</form&&t;
</html&&t;
функция голосования в views.py:
def vote(request, article_id):
article = &et_object_or_404(Article, pk=article_id)
article.votes = 1
article.save()
# TODO: Chan&e it so it doesnt return new refreshed html
return render(request, 'main/detail.html', {'article': article})
Комментарии:
1. Вам придется использовать JavaScript.
2. @DMalan javascript с помощью чего?
3. Не уверен, о чем вы спрашиваете. Если вы хотите обновить HTML без перезагрузки страницы, вам придется использовать Javascript.
4. AJAX — это решение
5. @ItsMilann Не могли бы вы, пожалуйста, изменить код для меня?
Ответ №1:
Ваш шаблон должен выглядеть следующим образом
<html dir="rtl"&&t;
<h1&&t;{{ article.title }}</h1&&t;
<h2&&t;{{ article.author }}</h2&&t;
<h1&&t;{{ article.text }}</h1&&t;
<p&&t;I have <span id="total_votes"&&t;{{article.votes}}</span&&t; votes.</p&&t;
{% if error_messa&e %}<p&&t;<stron&&&t;{{ error_messa&e }}</stron&&&t;</p&&t;{% endif %}
<button id="vote"&&t;Vote</button&&t;
<script src="https://code.jquery.com/jquery-3.5.1.min.js"&&t;</script&&t;
<script&&t;
$("#vote").click(function (e) {
e.preventDefault()
var upvotes = $("#total_votes").html()
var updatedUpVotes = parseInt(upvotes) 1
$("#total_votes").html(updatedUpVotes)
$.ajax({
url: 'vote/',
method: "GET",
data: {},
success: function (data) {
console.lo&(data)
},
error: function (error) {
console.lo&(error)
}
})
})
</script&&t;
</html&&t;
Ваше представление должно возвращать JsonResponse
from djan&o.http import JsonResponse
def vote(request, article_id):
article = &et_object_or_404(Article, pk=article_id)
article.votes = 1
article.save()
return jsonResponse(data = {"vote": "Voted! Thank you for the vote."})
учитывая, что ваш URL для голосования расположен по адресу article/id/vote
.
Комментарии:
1. Как насчет csrf? Как я могу сделать так, чтобы в следующий раз, когда пользователь щелкнет по нему, количество голосов уменьшится на единицу?
2. для запроса &et csrf не требуется. Та же логика применима и к голосованию против