장고

개발 일지 12 - 게시판 좋아요 기능

sorecord 2024. 8. 26. 13:12

원래는 Like DB를 사용을 해서 코드를 구현을 하려고 했다. 

 

하지만 좋아요 기능은 조건이 필요하다.

 

1. 한 계정이 한 번 누르면 올라가지만 한 번 더 누르면 증가해서는 안 된다.

 

2. 좋아요 버튼을 한 번 더 누를 시에 증가가 아닌 감소를 하게 만든다.

 

위의 조건을 만족을 시켜주기 위해 좋은 기능이 없을까 하고 구글링을 해본 결과 다대다 관계라는 것을 알게 되었다.

 

한 명의 사용자가 여러 개의 게시물을 좋아할 수 있고, 한 개의 게시물이 여러 명의 사용자에 의해 좋아질 수 있는 경우라는 것이다. 그리고 그럴 때  ManyToManyField를 사용하여 구현을 할 수 있다고 하길래 DB를 수정을 해주었다 

 

기존 Post_information DB에 아래 코드를 추가해주었다. 

 

like_users = models.ManyToManyField(User_information,default=1, related_name='post_like_user',blank =True)

 

이 코드를 추가하고 makemigrations와 migrate를 하는데 django.db.utils.IntegrityError: 이 문제가 계속 발생해서 구글링을 해보았다. 

 

다양한 방법이 있었지만 기존에 존재하던 아이디를 삭제를 하니 문제가 해결이 되었다. ( 좋은 해결방안은 아니라고 한다. )

 

def post_like(request, pk):
    print('like')
    post = get_object_or_404(Post_information, pk=pk)
    user_id = request.session.get('username')
    user = User_information.objects.get(username=user_id)
    if post.like_users.filter(pk=user.pk).exists():
        post.like_users.remove(user)
        return redirect('post_detail', pk=pk)
    else:
        post.like_users.add(user)

 

그리고 위와 같이 코드를 구현을 해주었다. 만약 유저가 눌렀다면 좋아요를 취소하고 누른 정보가 없다면 추가하라는 조건문이다. 

 

like_count = post.like_users.count()
 context = {
 'like_count':like_count, #좋아요 카운팅
 }
  return render(request, 'book/post_detail.html', context)

 

위 코드는 post_detail 함수이다. 좋아요를 눌렀을때 숫자를 표시해주기 위해서 context값에 담아서 보내주었다. 

 

<div>
     <form method="post" action="{% url 'post_like' post.pk %}" style="display:inline;">
          {% csrf_token %}
          <button type="submit">좋아요</button><p>좋아요 수: {{ like_count }}</p>
     </form>
</div>

 

위와 같이 구현함