장고

개발 일지 13 - 댓글 좋아요 기능

sorecord 2024. 8. 27. 13:18

어제 게시판 좋아요 기능을 달고 나서 하는 방법을 알 것 같았다.

 

comment DB와 comment_reply DB에 각각 manytomanyField를 추가해주었다.

 

def comment_like(request,pk):
    print("commentlike")
    user_id = request.session.get('username')
    user = User_information.objects.get(username=user_id)
    try:
        comment = Comment.objects.get(id=pk)
        print(comment)
        if comment.comment_like_users.filter(pk=user.pk).exists():
            print("comemntcancel like button")
            comment.comment_like_users.remove(user)
           
        else:
            print('commentadd like')
            comment.comment_like_users.add(user)
        
        return redirect('post_detail', pk=comment.post.id)
    
    except Comment.DoesNotExist:
        print("commentreply")
        comment_reply = Comment_Reply.objects.get(id=pk) 
        try:
                # 우선 comment 필드에서 게시글 ID를 가
            post_id = comment_reply.comment.post.id
        except AttributeError:
                # 만약 comment 필드가 None이면 parent 필드를 통해 게시글 ID를 가져옴
            post_id = comment_reply.parent.comment.post.id
        print(comment_reply)
        if comment_reply.commentR_like_users.filter(pk=user.pk).exists():
            print("cpmmentReplycancel like button")
            comment_reply.commentR_like_users.remove(user)
        else:
            print('comment reply add like')
            comment_reply.commentR_like_users.add(user)
        
        
        return redirect('post_detail', pk=post_id)

 

어제 사용했던 정보를 이용해서 구현하는데 어려움이 없었다. 하지만 각 좋아요를 카운팅 하는 것에서 문제가 발생했다. 

 

게시판의 좋아요 같은 경우는 post_detail에서 받는 pk가 게시글의 위치를 알려주는 정보였기에 아래와 같이 손쉽게 구현할 수 있었다. 

 

post = get_object_or_404(Post_information, pk=pk)
like_count = post.like_users.count()

 

댓글은 그렇지 않다는 것을 깨달았다. 다른 DB에 저장이 되어있으니 pk값을 사용할 수 없을 것이라는 생각이 들었다. 

그래서 첨에는 comment_like 함수에 카운팅 값을 넣어서 render함수를 이용해서 값을 보내려고 했다. 

 

comment_like_count = comment.comment_like_users.count()
        context = {
             'comment_like_count': comment_like_count,
        }
pk=comment.post.id
return render(request, 'book/post_detail.html', context)

 

하지만 url에 설정을 해둔 경로를 따라 가는 바람에 기존의 게시판 파일이 나오는것이 아니라 아무것도 없는 화면이 출력이 되었다. 이 코드를 사용할 수 없겠다고 판단했다.

 

for comment in comments:
        comment.like_count = comment.comment_like_users.count()
        # 대댓글에 대해서도 좋아요 수 추가
        for reply in comment.replies.all():
            reply.like_count = reply.commentR_like_users.count()

그래서 위와 같은 코드를 짯짜서 하나씩 카운팅을 해주는 코드를 짰다. 그리고 이 값을 그대로 보내고 

아래 조건문을 만들었다. 

{% if comment.parent or comment.comment %}
                    <!-- 대댓글의 좋아요 처리 -->
                    <span>좋아요: {{ comment.commentR_like_users.count }}</span>
                    .....
                    ...
                    
{% else %}
                    <!-- 댓글의 좋아요 처리 -->
                    <span>좋아요: {{ comment.comment_like_users.count }}</span>
                    .....
                    ...
                    
{% endif %}

데이터 베이스가 나누어져 있기에 구분을 해주는 것이 중요하다고 생각했다. 

Commet_Reply DB에는 Comment DB의 parent로 받는 값과 comment로 받는 값이 존재하기에 해당 조건이 들어있는 경우 대댓글의 좋아요를 표시하고 그렇지 않을 경우 부모 댓글의 좋아요를 표시하도록 했다.

 

마지막 쯤에 댓글 DB를 하나로 통합하던지 해야겠다. 코드가 너무 복잡해지고 스스로 난이도를 높이고 있는 것 같다.