Кнопка "Нравится" не меняется на "Не нравится", 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:

Пара моментов

  1. Ваша контекстная переменная должна называться
    {% if liked_by_current_user %}

поскольку это отдельная контекстная переменная, а не метод или атрибут post.

  1. Ваш оператор 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")
Вернуться на верх