У меня проблема с функцией "нравится". Я хочу сделать так, чтобы можно было лайкнуть пост, не перегружая всю страницу. Поэтому я использовал CBV django, подключенный к ajax.
Моя проблема в том, что он получает: Not Found: /like/ по нажатию кнопки "Нравится".
Мой взгляд:
class PostLikeView(generic.View):
def post(self, request):
post = get_object_or_404(Post, id=request.POST.get('id'))
is_liked = False
if post.likes.filter(id=request.user.id).exists():
post.likes.remove(request.user)
is_liked = False
else:
post.likes.add(request.user)
is_liked = True
context = {
'post': post,
'is_liked': is_liked,
'total_likes': post.total_likes(),
}
if request.is_ajax():
html = render_to_string('post/like_section.html', context, request=request)
return JsonResponse({'form': html})
Ниже приведен код jquery:
<script type = "text/javascript">
$(document).ready(function(event){
$(document).on('click', '#like', function(event){
event.preventDefault;
var pk = $(this).attr('value');
$.ajax({
type: 'POST',
url: "{% url 'post:post_like' %}",
data: {'id': pk, 'csrfmiddlewaretoken': '{{ csrf_token }}'},
dataType: 'json',
success: function(response){
$('#like-section').html(response['form'])
console.info($('#like-section').html(response['form']))
},
error: function(rs, e){
console.info(rs.responseText);
},
});
});
});
</script>
URL для просмотра:
url(r'^like/$', login_required(PostLikeView.as_view()), name='post_like'),
код в html:
<form action = "{% url 'post:post_like' %}" method = "post">
{% csrf_token %}
{% if is_liked %}
<button type = "submit" id = "like" name = "post_id" value = "{{ post.id }}" class = "btn btn-danger">Dislike</button>
{% else %}
<button type = "submit" id = "like" name = "post_id" value = "{{ post.id }}" class = "btn btn-primary">Like</button>
{% endif %}
</form>
Хотелось бы, чтобы кнопка работала по принципу не перезагружать всю страницу.






Я думаю, проблема в том, что вы на самом деле не используете называетсяevent.preventDefault в обработчике событий щелчка (вам не хватает скобок). Это означает, что кнопка отправки отправляет форму, но форма не содержит параметра с именем id, поэтому get_object_or_404(Post, id=request.POST.get('id')) вызывает ошибку 404.
Добавьте недостающие скобки в event.preventDefault, а также обратите внимание, что значение атрибутов id= в элементах HTML должно быть уникальный на странице. Измените значения атрибутов id= в элементах <button>, чтобы они были уникальными.