Я работал над чем-то из сайта блога, и на нем, конечно, вы отправляли вещи. У меня есть index.html, где у меня есть:Django for-loop активирует просмотр несколько раз, когда нажимается кнопка
{% for post in posts %} {% include "blog/featuredpost.html" %} {% endfor %}
Я также использовал разбивку на страницы Django. Теперь, что я хочу сделать, это кнопка типа «нравится» и «не нравится», которая многократно используется, что означает, что я, вероятно, захочу ее в «blog/featuredpost.html». Итак, вот что я сделал.
<div class="row">
<div class="col-sm-5">
<div id="divLikes" class="col-sm-6 bg-success text-center">
Likes: {{ post.likes }}
</div>
<div id="divDislikes" class="col-sm-6 bg-danger text-center text-block">
Dislikes: {{ post.dislikes }}
</div>
</div>
{% if user.is_authenticated %}
<div>
<div class="col-sm-2">
<form id="like_form" action="" method="POST">
{% csrf_token %}
<button id="like_button" type="submit" value="vote" class="btn btn-success btn-sm btn-block">
<span class="glyphicon glyphicon-thumbs-up" aria-hidden="true"></span> Like
</button>
</form>
</div>
<div class="col-sm-2">
<button type="button" class="btn btn-danger btn-sm btn-block">
<span class="glyphicon glyphicon-thumbs-down" aria-hidden="true"></span> Dislike
</button>
</div>
<div class="col-sm-3">
<button type="button" class="btn btn-warning btn-sm btn-block">
<span class="glyphicon glyphicon-comment" aria-hidden="true"></span> Comment
</button>
</div>
</div>
{% endif %}
<script type="text/javascript">
//$('#like_button').click(function(){ });
/* The for cycle sends all the posts id that should appear on the page.
It should send just the one on which the like button is clicked. */
$(document).on('submit', '#like_form', function(event) {
event.preventDefault();
$.ajaxSettings.traditional = true;
$.ajax({
type: 'POST',
url: '{% url "like" %}',
dataType: 'json',
data: {
csrfmiddlewaretoken: '{{ csrf_token }}',
LikeId: {{ post.id }},
},
success: function(response) {
$('#divLikes').load(' #divLikes', function() {
/* It's important to add the space before #divLikes, I don't know why */
$(this).children().unwrap()
})
}
});
})
views.py
def view_like(request):
# AJAX Like Button
if request.user.is_authenticated:
if request.method == 'POST':
likepostId = request.POST.get('LikeId', '')
print(likepostId)
likepost = get_object_or_404(Post, id=likepostId)
print(likepost.title + " has " + str(likepost.likes))
response_data = {}
return JsonResponse(response_data)
else:
raise Http404
return 200
В настоящее время я его так, что бы просто распечатать некоторые вещи. На первой странице он просто реплицирует часть html/css из-за функции успеха AJAX. Как я могу сделать, как кнопка, специально знать, что я хочу, чтобы на определенном посту, на который я нажал? Потому что, как и сейчас, он просто рассылает все идентификаторы всех других сообщений на странице, в определенном порядке.
Я вроде как понимаю, что вы мне говорите, но я не знаю, что значит «перехватить событие для класса». У меня мало опыта работы с javascript и ajax, поэтому, если вы не возражаете, можете ли вы правильно исправить свой сценарий? И из того, что я собираю, вы говорите, что #like_form не требуется, потому что javascript уже понимает vote_button, потому что, как вы сказали, это должно быть связано. В любом случае, спасибо, искренне. – AquaSolid
Вместо того, чтобы показывать пять сообщений на странице, а не показывает тот, который нажал, но пять раз. И также функция успеха должна обновлять div, поэтому он меняет Likes 0 на Likes 1 – AquaSolid
Я решил проблему, поставив класс vote_button на имя vote_button {{post.id}}, таким образом у нас есть класс с ID за ним, заставляя его работать для каждого отдельного сообщения. – AquaSolid