장고 첫번째 팀프로젝트 :: 게시판 CRUD관련 코드 리뷰 - 상세페이지에 댓글 생성 삭제 및 편집/ 게시물 좋아요/ 댓글 좋아요

권수민·2023년 9월 20일
0

포스트 좋아요 모음 메소드 :
모든 좋아요를 다가져와서 templates에 보내줍니다.

                {% if post.liked_post.count > 0 %}
                <br>
                <br>
                <p>추천: {{ post.liked_post.count }}</p>
                <div class="btn-group">
                    <a href="{% url 'post:like' post.id %}" class="btn btn-info">추천인 명단</a>
                </div>
                {% else %}
                <br>
                <p>추천이 없습니다</p>
                {% endif %}

.count는 내장된 장고의 기능으로 id를 세어저 반환해준다.
그래서 모델안에 따로 COUNT관련 값을 넣어주지 않은것. => 충돌이 일어날 확률이 높아.

def like_list(request, post_id):
    list = PostLike.objects.filter(post_id=post_id)
    return render(request, "post/like_list.html", {"list": list})

코멘트 좋아요 모음 메소드:

위의 포스트 좋아요와 같은 방식으로 활용


def commentlike_list(request, comment_id):
    list = CommentLike.objects.filter(comment_id=comment_id)
    return render(request, "post/like_list.html", {"list": list})

코멘트 생성 메소드:

def detail(request, post_id):
    post = get_object_or_404(Post, id=post_id)
    comments = Comments.objects.filter(post_id=post_id)
    #댓글 모델에서 그 포스트에 있는 모든 댓글을 가져오게함

    if request.method == "GET":
        form = CommentForm(request.POST)
        return render(
            request,
            "post/detail.html",
            {
                "post": post,
                "comments": comments,
                "form": form,
                "MEDIA_URL": settings.MEDIA_URL,
            },
        )
        
    #포스트 
    else:
    	#template안에 폼으로 요청하는 것들이 많아서 따로 NAME을 설정해서 받아주었다.
        #따로 Url설정하고 메소드 생성해서 하는것도 더 깔금 했을것
        
        #댓글 저장
        if request.method == "POST" and "wow12" in request.POST:
            if request.user.is_authenticated:
                form = CommentForm(request.POST)
                if form.is_valid:
                    comment = form.save(commit=False)
                    comment.author = request.user
                    comment.post = post
                    comment.save()
                    return redirect("post:detail", post_id=post.id)
                else:
                    form = CommentForm()
                    return render(request, "post/detail.html", {"form": form})
            else:
                return redirect("post:detail", post_id=post.id)

		#포스트 좋아요 저장
        if request.method == "POST" and "wow11" in request.POST:
            if request.user.is_authenticated:
            	# 이미 좋아요 누른 게 있느지 확인해서 있으면 똑같은 페이지로 돌아가기
                if request.user in post.liked_post.all():
                    return redirect("post:detail", post_id=post.id) #중복방지				
                # 아니면 좋아요 눌러주는거 저장
                else:
                    like = PostLike.objects.create(user=request.user, post=post)
                    like.save()
                	return redirect("post:detail", post_id=post.id)
            else:
                return redirect("post:detail", post_id=post.id)
		
        #댓글 좋아요 저장
        if request.method == "POST" and "wow13" in request.POST:
            if request.user.is_authenticated:
                comment_id = request.POST.get("comment_id")
                comment = Comments.objects.get(id=comment_id)
                #이미 좋아요 누른사람은 그대로 돌아가
                if request.user in comment.liked_comments.all():
                    return redirect("post:detail", post_id=post.id)
                #아니면 좋아요 저장
                else:
                    commentlike = CommentLike.objects.create(
                        user=request.user, comment=comment
                    )
                    commentlike.save()
                    return redirect("post:detail", post_id=post.id)
            else:
                return redirect("post:detail", post_id=post.id)
    

코멘트 수정 메소드:
똑같이 instance로 받아와서 저장

@login_required(login_url="login")
def comment_update(request, post_id, comment_id):
    post = get_object_or_404(Post, id=post_id)
    comments = Comments.objects.filter(post=post)
    comment = get_object_or_404(Comments, id=comment_id)
	
    #권한 설정
    if request.user != post.author:
        messages.error(request, "수정권한이 없습니다")
        return redirect(reverse("post:detail", args=[post.id]))#kwargs={,}

    if request.method == "POST":
        comment_form = CommentForm(request.POST, instance=comment)
        
        if comment_form.is_valid():
            form = comment_form.save(commit=False)
            form.author = request.user
            form.post = post
            
            #원래는 밑에 있는 comment가 스스로 저장이 되어야 하는데
            #데이터 베이스에 저장이 안되서 직접 일입력해줌.
            #아무래도 직접적인 post_id가 연결이 안되어서인건지 확실치 않지만,
            # 앞으로 데이터베이스가 저장안될때는 직접 넣어줘야한다
            form.comment = request.POST.get("content")
            form.save()
            
            #reverse("url", args= [], 또는 kwargs={딕셔너리형태=> key: 인수})
            #reverse("post:detail", kwargs={}
            return redirect(reverse("post:detail", args=[post.id]))
            
        else:
            comment_form = CommentForm(instance=comment)
            return HttpResponse("Invalid comment_form", status=405)

   
	#해당 글의 자신이 쓴 댓글에만 수정버튼을 달게하기 위해서 따로 생성
    user_comments = Comments.objects.filter(post=post, author=request.user)

    return render(
        request,
        "post/detail_update.html",
        {"post": post, "comment": comment, "user_comments": user_comments},
    )
    

코멘트 삭제 메소드:
포스트 삭제와 다를바 없지만
comment = get_object_or_404(Comments, id=comment_id)
커멘트에서 받아오는 인스턴스를 하나 추가해준것

@login_required(login_url="users:login")
def comment_delete(request, post_id, comment_id):
    comment = get_object_or_404(Comments, id=comment_id)
    post = get_object_or_404(Post, id=post_id)
    if request.user != post.author:
        messages.error(request, "삭제권한이 없습니다")
        return redirect("post:detail", post_id=post.id)
    else:
        comment.delete()
        return redirect("post:detail", post_id=post.id)
profile
초보개발자

0개의 댓글