Кнопка "Нравится" не меняется на "Не нравится", Django
Когда пользователь ставит Like, должна отображаться обратная кнопка Dislike, но этого не происходит. Если убрать условие if, то like и dislike работают отдельно, данные записываются в базу и удаляются соответственно. Но есть проблема с условием if. Когда пользователь уже поставил Like, из базы данных не берется информация о том, что ему нужно поставить Dislike вместо Like. Не понимаю почему.
models.py:
class PostLike(models.Model):
userlikepost = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
likepost = models.ForeignKey(Userpublication, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
unique_together = ('userlikepost', 'likepost')
views.py:
def show_post(request, post_slug):
post = get_object_or_404(Userpublication, slug=post_slug)
like_count = PostLike.objects.filter(likepost=post).count()
liked_by_current_user = False
if request.user.is_authenticated:
liked_by_current_user = PostLike.objects.filter(likepost=post, userlikepost=request.user).exists()
print(f'liked_by_current_user: {liked_by_current_user}')
context = {
'post': post,
'like_count': like_count,
'liked_by_current_user': liked_by_current_user,
}
return render(request, 'pie/home.html', context)
@login_required
def like_post(request, post_id):
try:
post = Userpublication.objects.get(pk=post_id)
like, created = PostLike.objects.get_or_create(userlikepost=request.user, likepost=post)
like_count = PostLike.objects.filter(likepost=post).count()
like_count = PostLike.objects.filter(likepost=post).aggregate(count=Count('id'))['count']
return JsonResponse({'liked': created, 'like_count': like_count})
except Exception as e:
return JsonResponse({'error': str(e)}, status=500)
@login_required
def unlike_post(request, post_id):
try:
post = Userpublication.objects.get(pk=post_id)
like = PostLike.objects.filter(userlikepost=request.user, likepost=post).first()
if like:
like.delete()
like_count = PostLike.objects.filter(likepost=post).count()
return JsonResponse({'unliked': True, 'like_count': like_count})
except Exception as e:
return JsonResponse({'error': str(e)}, status=500)
html:
{% if post.liked_by_current_user %}
<div class="unlike-button" data-post-id="{{ post.id }}">Dislike<span class="like-count-value" data-post-id="{{ post.id }}">{{ like_count }}</span></div>
{% else %}
<div class="like-button" data-post-id="{{ post.id }}">Like<span class="like-count-value" data-post-id="{{ post.id }}">{{ like_count }}</span></div>
{% endif %}
JS:
Пара моментов
- Ваша контекстная переменная должна называться
{% if liked_by_current_user %}
поскольку это отдельная контекстная переменная, а не метод или атрибут post.
- Ваш оператор If находится в вашем шаблоне. Оно не изменится, пока страница не будет перезагружена и шаблон не пересчитан. Однако, поскольку вы используете ajax для отправки своих "нравится/не нравится", страница не перезагружается, и поэтому шаблон не выдает новый HTML.
Самый простой способ исправить это - добавить код для изменения кнопки в метод успеха ajax. Так, чтобы изменить Like на Dislike, нужно сделать что-то вроде...
//find the button
buttonToChange = document.querySelector("[data-post-id='" + postID + "']")
//toggle the button class
buttonToChange.classList.add('unlike-button')
buttonToChange.classList.toggle('like-button')
//change the button text
buttonToChange.textContent = ButtonToChange.textContent.replace("Like", "Dislike")