게시글에 댓글달기를 구현하기에 앞서 이전의 포스팅에서는 공지사항 앱인 notice app을 활용하여 포스팅을 진행하였습니다. 하지만 공지사항에는 댓글을 달 수 없도록 설정하였기에 이 프로젝트에서는 자유롭게 게시글을 작성하고 소통할 수 있는 자유게시판 앱을 추가하였습니다. 구현 방법은 공지사항 앱과 같으며 free란 app을 생성했다는 가정하에 포스팅을 진행하겠습니다. 댓글 포스팅은 총 2개로 나누어 포스팅할 예정입니다. 기본적인 구현 로직은 다음과 같습니다.
level0 개발자, level1 관리자 : 모든 댓글의 입력, 삭제
level2 사용자 : 댓글의 입력 (본인 글일시 댓글의 입력, 삭제)
본인의 글일시 댓글에 (글쓴이) 표시를 한다.
댓글 작성, 삭제시 그 갯수를 동적으로 표시한다.
본 게시글이 삭제될시 댓글은 DB상에서 삭제된다.
댓글 삭제시 DB상에서 내용은 보존한다.
댓글 삭제시 삭제된 댓글이라는 표시를 한다.
댓글 입력, 삭제는 비동기로 구현한다.
1. 댓글 models.py 작성
댓글을 작성하기 위한 models을 생성하기 위해 적용할 게시판앱의 models.py에 아래의 Comment 클래스를 추가합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
# free/models.py
class Comment(models.Model): post = models.ForeignKey(Free, on_delete=models.CASCADE, verbose_name='게시글') writer = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, verbose_name='댓글작성자') content = models.TextField(verbose_name='댓글내용') created = models.DateTimeField(auto_now_add=True, verbose_name='작성일') deleted = models.BooleanField(default=False, verbose_name='삭제여부') def __str__(self): return self.content
templates에서 json으로 받은 댓글의 내용과 작성자를 id값에 맞는 post에 create메소드를 사용하여 댓글을 생성합니다. 성공적으로 DB에 댓글이 생성되었을시 댓글의 id값, 글작성자와 댓글작성자를 비교해 글쓴이 여부 등과 같은 data를 딕셔너리형으로 담아 response합니다.
4. 댓글삭제 views.py 작성
댓글삭제도 댓글쓰기 view와 마찬가지로 게시글의 id값을 인자로 받는 comment_delete_view를 아래와 같이 작성합니다.
if request.user == target_comment.writer or request.user.level == '1' or request.user.level == '0': target_comment.deleted = True target_comment.save() post.save() data = { 'comment_id': comment_id, } return HttpResponse(json.dumps(data, cls=DjangoJSONEncoder), content_type = "application/json")
댓글삭제 요청이 들어왔을 경우 pk값으로 받은 게시글의 id를 사용해 게시글을 찾아내고, 댓글의 id값인 comment_id와 비교하여 삭제요청을 한 사용자의 등급이 관리자거나 글쓴이 본인일 경우에 댓글의 deleted 필드를 True로 변경합니다. templates에서는 deleted가 True인 댓글을 템플릿 필터를 활용해 삭제메세지로 표시할 수 있게 됩니다.
5. urls.py 작성
구현한 views를 연결하기 위해 urls.py의 urlpatterns에 아래와 같이 path를 추가합니다.
사용자가 게시글을 GET으로 접근했을시 보여지는 템플릿을 우선적으로 작성합니다. 템플릿 필터를 활용하여 삭제댓글, 글쓴이 표시를 하고 비동기로 댓글이 append될 hidden 타입의 comment_list div를 추가합니다. 작성자를 얻기 위해 현재 접속된 사용자를 value값으로 설정합니다.
댓글의 내용과 작성자를 이전에 구현한 comment_write_view에 json형태로 전달합니다. comment_wirte_view에서 성공적으로 응답이 오면 본인 글에 댓글을 작성할시 작성자 옆에 (글쓴이)표시를 하기 위해서 self_comment의 여부를 확인하고 hidden type으로 설정해둔 comment_list에 적절한 html을 append시킵니다.
8. 댓글삭제 templates 작성
댓글 삭제를 위한 Script는 아래와 같습니다. 사용자가 댓글 삭제를 클릭할 시 confirm 창으로 삭제여부를 확인하고 comment_delete_view에서 본인의 댓글인지 확인 후 성공적으로 삭제가 되었을시 templates에서 응답을 받아 replaceWith메소드를 통해 삭제된 댓글입니다.라는 표시를 하게 됩니다.