@nikidreiks

Не меняется кнопка Лайк на Дизлайк, в чем ошибка?

Когда пользователь ставит Лайк должна отображаться обратная кнопка Дизлайк, но этого не происходит. Если убрать условие if, то по отдельности лайк и дизлайк работают, в бд данные записываются и удаляются соответственно.
А вот с условием if проблема. Когда пользователь уже поставил Лайк из базы данных не берется информация о том, что нужно вместо Лайк ставить Дизлайк. Не понимаю почему.

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, 'twippie/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()

        # Оптимизированный подсчет лайков с использованием агрегации Django
        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)


шаблон:

{% if post.liked_by_current_user %}
    <div class="unlike-button" data-post-id="{{ post.id }}">Дизлайк<span class="like-count-value" data-post-id="{{ post.id }}">{{ like_count }}</span></div>
{% else %}
    <div class="like-button" data-post-id="{{ post.id }}">Лайк<span class="like-count-value" data-post-id="{{ post.id }}">{{ like_count }}</span></div>
{% endif %}


<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
    $(document).ready(function() {
        // Функция для обновления количества лайков
        function updateLikeCount(postId, likeCount) {
            $('#like-count-' + postId + ' .like-count-value').text(likeCount);
            console.log('Количество лайков для поста с ID ' + postId + ': ' + likeCount);
        }

        $('.like-button').click(function() {
            var postId = $(this).data('post-id');
            var csrfToken = '{{ csrf_token }}';
            $.ajax({
                type: 'POST',
                headers: {
                    'X-CSRFToken': csrfToken
                },
                url: '/like/' + postId + '/',
                success: function(data) {
                    if (data.liked) {
                        updateLikeCount(postId, data.like_count);
                    }
                },
                error: function(xhr, status, error) {
                    console.error(xhr.responseText);
                }
            });
        });

        $('.unlike-button').click(function() {
            var postId = $(this).data('post-id');
            var csrfToken = '{{ csrf_token }}';
            $.ajax({
                type: 'POST',
                headers: {
                    'X-CSRFToken': csrfToken
                },
                url: '/unlike/' + postId + '/',
                success: function(data) {
                    if (data.unliked) {
                        updateLikeCount(postId, data.like_count);
                    }
                },
                error: function(xhr, status, error) {
                    console.error(xhr.responseText);
                }
            });
        });
    });
</script>


<script>
$(document).ready(function() {
    // Функция для обновления количества лайков
    function updateLikeCount() {
        $('.like-count-value').each(function() {
            var postId = $(this).data('post-id');
            var likeCountElement = $(this);
            $.ajax({
                type: 'GET',
                url: '/get_like_count/' + postId + '/',
                success: function(data) {
                    var likeCount = parseInt(data.like_count);
                    if (!isNaN(likeCount)) {
                        likeCountElement.text(likeCount);
                        console.log('Количество лайков для поста с ID ' + postId + ': ' + likeCount);
                    }
                },
                error: function(xhr, status, error) {
                    console.error(xhr.responseText);
                }
            });
        });
    }

    // Вызов функции при загрузке страницы
    updateLikeCount();

    $('.like-button').click(function() {
        var postId = $(this).data('post-id');
        var csrfToken = '{{ csrf_token }}';
        $.ajax({
            type: 'POST',
            headers: {
                'X-CSRFToken': csrfToken
            },
            url: '/like/' + postId + '/',
            success: function(data) {
                if (data.liked) {
                    updateLikeCount(); // Обновляем количество лайков после лайка
                }
            },
            error: function(xhr, status, error) {
                console.error(xhr.responseText);
            }
        });
    });

    $('.unlike-button').click(function() {
        var postId = $(this).data('post-id');
        var csrfToken = '{{ csrf_token }}';
        $.ajax({
            type: 'POST',
            headers: {
                'X-CSRFToken': csrfToken
            },
            url: '/unlike/' + postId + '/',
            success: function(data) {
                if (data.unliked) {
                    updateLikeCount(); // Обновляем количество лайков после дизлайка
                }
            },
            error: function(xhr, status, error) {
                console.error(xhr.responseText);
            }
        });
    });
});
</script>
  • Вопрос задан
  • 101 просмотр
Решения вопроса 1
@chemdev
У тебя в шаблоне согласно коду представления атрибут liked_by_current_user является самостоятельным, а не аттрибутом post, поэтому условие и не работает.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы