댓글/좋아요/구독기능
의 경우 필수기능구현을 다 마치고 시간이 된다면 구현하기로 한 추가기능
이였습니다. 하지만 다른팀들과 달리 저희가 맡은 사이트는 커머스 사이트가 아니였기 때문에 추가기능을 꼭 해보고 싶었습니다.
다행히 프로젝트 마감일 전에 필수기능구현을 끝냈고 추가기능을 할 수 있는 시간이 주어져서 저는 댓글기능을 구현하기로 하였습니다.
class CommentView(View):
@login_decorator
def post(self, request ,posting_id):
try:
data = json.loads(request.body)
posting = Posting.objects.get(id=posting_id)
reply = data['reply']
user = request.user
Comment.objects.create(
reply = reply,
user = user,
posting = posting
)
return JsonResponse({"message" : "SUCCESS"}, status=201)
except KeyError:
return JsonResponse({"message" : "KEY_ERROR"}, status=401)
except Posting.DoesNotExist:
return JsonResponse({"message": "INVALID_POSTING"}, status=400)
댓글 작성하기 기능은 위와 같이 작성하였습니다.
댓글을 작성할 때 어떤 정보가 필요한지 고민하다가 1.유저가 로그인을 했는가?
2.어떤 포스팅에 댓글을 남겼는가?
3.댓글의 내용은 어떤 것인가?
이 세가지가 필요하다는 생각이 들어서 해당 부분을 염두에 두고 코드를 작성하였습니다.
먼저 login decorator
를 통해 로그인 한 유저만 댓글 작성이 가능하도록 하였습니다. (user = request.user
)
그리고 get메소드
를 통해 포스팅 id
를 가져와서 어떤 포스팅에서 댓글을 작성했는지 알 수 있도록 하였습니다.
try, except문을 통해 해당 포스팅이 존재하지 않을 경우 INVALID_POSTING이라는 메세지가 나오도록 작성하였습니다.
def get(self, request, posting_id):
try:
comments = Posting.objects.get(id=posting_id).comment_set.values('reply','user__name')
results= [comment for comment in comments]
return JsonResponse({"message":"SUCCESS", "results" : results}, status=201)
except Posting.DoesNotExist:
return JsonResponse({"message": "INVALID_COMMENT"}, status=401)
댓글 정보 불러오기 기능의 경우 posting이 comment를 역참조 하고 있기 때문에 comment_set.values('reply, 'user__name)
을 통해 댓글의 내용과 댓글을 작성한 유저의 이름을 확인할 수 있도록 작성하였습니다.
@login_decorator
def delete(self,request,comment_id):
try:
comment = Comment.objects.get(id=comment_id)
if request.user.id == comment.user.id:
comment.delete()
except Comment.DoesNotExist:
return JsonResponse({"message" : "INVALID_COMMENT"}, status=401)
제가 작성한 코드
는 위와 같습니다.
먼저 댓글의 id를 가져와서 그 댓글을 작성한 유저의 아이디와 현재 로그인한 유저의 아이디가 같을 경우 댓글을 삭제하는 방식의 코드였습니다.
코드리뷰 후 변경된 코드
는 다음과 같습니다.
@login_decorator
def delete(self,request,comment_id):
try:
Comment.objects.get(id=comment_id, user=request.user.id).delete()
return JsonResponse({"message" : "COMMENT_DELETE"}, status=201)
except Comment.DoesNotExist:
return JsonResponse({"message" : "INVALID_COMMENT"}, status=401)
제가 세줄로 작성한 코드가 한 줄로 깔끔하게 변경되었습니다.
Comment.objects.get(id=comment_id, user=request.user.id).delete()
get메소드를 위와 같이 활용하여 comment_id
를 가져와서 그 comment를 현재 로그인 한 유저가 작성했을 경우
삭제가 가능하도록 하였습니다.