Django admin сохраняет данные пользователей при удалении из списка like-list
Я создал кнопку like на django, которая сохраняет информацию о пользователях, нажавших на кнопку. Когда тот же пользователь снова нажимает на кнопку и "не нравится", счетчик рядом с кнопкой возвращается к числу до того, как пользователь нажал на нее, и пользователь должен быть удален из списка сохранения. Однако набор данных в админке сохраняет пользователя в списке как одного из тех, кто нажал на кнопку один раз после того, как он нажал ее.
Код не показывает ошибки, и я понятия не имею, что нужно изменить, чтобы удалить пользователей, которые "не понравились" из набора данных, потому что код
post_obj.liked.remove(user)
Мой models.py имеет следующий вид:
class Post(models.Model):
posts = models.CharField(max_length=420, unique=True)
slug = models.SlugField(max_length=42)
date_created = models.DateTimeField(auto_now_add=True)
liked = models.ManyToManyField(User, default=None, blank=True, related_name='liked')
updated = models.DateTimeField(auto_now=True)
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='author')
def __str__(self):
return str(self.posts)
LIKE_CHOICES = (
('like', 'like'),
('unlike', 'unlike'),
)
class Like(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
post = models.ForeignKey(Post, on_delete=models.CASCADE)
value = models.CharField(choices=LIKE_CHOICES, default='like', max_length=10)
Мой views.py имеет следующий вид:
def likes(request):
user = request.user
if request.method == 'POST':
post_id = request.POST.get('post_id')
post_obj = Post.objects.get(id=post_id)
if request.user.is_authenticated:
if user in post_obj.liked.all():
post_obj.liked.remove(user)
else:
post_obj.liked.add(user)
like, created = Like.objects.get_or_create(user=user, post_id=post_id)
if not created:
if like.value == 'like':
like.value = 'unlike'
else:
like.value == 'like'
like.save()
data = {
'value': like.value,
'likes': post_obj.liked.all().count(),
}
return JsonResponse(data, safe=False)
return redirect('/')