Как удалить лайк на 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 }} - &#x1f9e1;</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(как я понял от одного юзера один лайк так что ничего не сломается)

Вернуться на верх