Когда пользователь ставит Лайк должна отображаться обратная кнопка Дизлайк, но этого не происходит. Если убрать условие 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>