Как удалить лайк на django
я сделал систему лайков следуя одному видеоролику на YouTube. Но там не реализовывается система удаления лайка пользователя(Например если он передумал и решил убрать лайк). Я хотел бы узнать как реализовать эту систему.
views.py
class MoreInfoView(View):
def get(self, request, id):
user = BookModel.objects.filter(id=id).first()
stuff = get_object_or_404(BookModel, id=self.kwargs['id'])
total_likes = stuff.total_likes()
return render(request, 'bookapp/more_info.html', context={
'id': id,
'user': user,
'book': BookModel,
'total_likes': total_likes
})
def LikeView(request, pk):
book = BookModel.objects.get(id=pk)
book.likes.add(request.user)
return HttpResponseRedirect(reverse('more_info', args=[pk]))
models.py
title = models.CharField(max_length=100, verbose_name='Название')
creator = models.CharField(max_length=100, verbose_name='creator', null=True)
author = models.CharField(max_length=100, verbose_name='автор')
contentbook = models.TextField(verbose_name='Содержание')
picture = models.ImageField(upload_to='images/', verbose_name='Обложка')
price = models.IntegerField(null=True, verbose_name='Цена')
price_rent = models.IntegerField(null=True, verbose_name='Аренда')
likes = models.ManyToManyField(User, related_name='book_post', null=True, verbose_name='лайкнули')
def total_likes(self):
return self.likes.count()
def __str__(self):
return f'{self.title}'
class Meta:
verbose_name = 'Книга'
verbose_name_plural = 'Книги'
html
<form action="{% url 'like_book' id %}" method='POST'>
{% csrf_token %}
<p><button style="" type="submit" name="book_id" value="{{ book.id }}" class="btn btn-danger btn-sm">{{ total_likes }} - 🧡</button></p>
</form>
Если следовать за вашей реализацией:
book = BookModel.objects.get(id=pk)
if user in book.likes.all():
book.likes.remove(request.user)
book.total_likes()-1
book.save()
Находим юзера, который поставил лайк и удаляем его.
Не люблю видеоролики. Посоветую вам книгу Антонио Меле Джанго 2 в примерах,
там нет про лайки, но предположу, что если вы пишите
интернет магазин книг, то там есть для вас много полезного.
Она есть на русском. И актуальна еще как по мне.
P.S.
Не понимаю идеи до конца но в этих строках, что-то пошло не так:
user = BookModel.objects.filter(id=id).first()
stuff = get_object_or_404(BookModel, id=self.kwargs['id'])
Вы обращаетесь к BookModel, но переменные у вас user и staff.
Получить юзера текущего можно из request.
user = request.user. Командой User.objects.all() вы получите
queryset всех юзеров из базы.
В первой строке где filter вы получаете кверисет и с помощью .first()
получаете самый первый объект из бд.
Строка, где переменная stuff объект из той же таблицы, что
и user - BookModel. Cудя по названию это книги, но точно не user и
stuff.
Тут у тебя список. Удаляй через pop передавай туда user(как я понял от одного юзера один лайк так что ничего не сломается)