● 댓글 수정 기능 구현
댓글 수정 버튼 테스트
댓글을 작성 하였으나 수정 할 수 없다면 정말 난감 할 것이다. 그러므로 수정 버튼을 만들어 수정 할 수 있도록 한다.
테스트 코드 작성 후 post_detail.html 파일 수정
이전에 comment를 2개 작성 하였으므로 이를 참고하여 테스트 코드를 작성한다.
테스트 코드 수정
추가적인 테스트를 위해 def test_comment_update에 내용을 추가한다.
댓글 수정 페이지 만들기
urls.py에 댓글 수정 페이지 경로를 추가한다.
update_comment/<int:pk>/ 경로에서 쓸 CommentUpdate 클래스를 views.py파일에 추가한다.
models.py에서 Comment class를 가져온다.
urls.py에서 추가한 코드가 인식 할 수 있도록 CommentUpdate 클래스를 만든다.
LoginRequiredMixin은 비로그인 상태의 사용자가 CommentUpdate에 POST 방식으로 접근하는 것을 막기위해 사용한다. form_class는 이전에 만들어준 CommentForm을 이용한다.
edit 버튼을 누르면 단순히 수정 페이지로 들어가는 것이라서 GET 방식으로 페이지에 접근하게 된다. 하지만 submit 버튼을 누르면 POST방식으로 /blog/update_comment/1/ 경로로 입력한 내용을 전달하는데 문제는 A라는 사용자가 /blog/update_comment/1/ 주소 창에 입력을 하면 B가 작성한 pk값이 1인 comment를 수정 할 수 있게된다. 이를 막기 위해 dispatch() 메서드에서 GET인지 POST인지 판단하기 전에 로그인한 사용자가 아닌 경우 PermissionDenied가 발생하도록 한다.
dispatch()는 Overloading 구현을 위한 라이브러리로 Overloading은 같은 이름의 메서드(method)에 매개변수의 개수나 형식을 다르게 지정해 2개 이상의 메서드를 정의하는 것을 의미한다.
템플릿 만들기
웹 브라우저 타이틀이 Edit Comment - Blog인 comment_form.html 파일을 새로 만든 후 내용을 입력해 준다.
post_detail.html 파일에 Updated: 문구를 만든다. 이것은 created_at과 modified_at의 값이 다를 경우 Update: 문구 뒤에 modified_at (수정된 시간)을 출력하도록 한다.
● 댓글 삭제 기능 구현
테스트 코드 작성
댓글 삭제 버튼과 모달 제작
post_detail.html 수정
float-right가 두 개 있으면 안 되기 때문에 기존에 edit class의 float-right를 삭제한다. 그리고 버튼이 제대로 작동하게 하기 위하여 버튼 class의 id가 comment-{{ commnet.pk }}-delete-modal-btn라면 data-target id와 일치하게 한다.
Modal-body 부분은 삭제될 댓글 내용을 보여준다. 여기서 <del> 태그는 취소선을 그어준다.
Delete 버튼을 누르면 Are You Sure 문구를 출력하고 여기서 더 클릭하면 댓글을 삭제하는 경로로 이동한다.
views.py과 urls.py 수정
get_object_or_404()함수를 통해 delete_comment() 함수에서 인자로 받은 pk값과 같은 pk 값을 가진 댓글을 쿼리셋으로 받아서 comment 변수에 저장한다. 인자로 받은 pk에 댓글이 존재하지 않으면 404오류을 일으킨다.
views.py에 class가 아닌 def로 작성했기 때문에 함수명만 views. 에 붙여서 해당하는 view에 매칭시킨다.
'Backend > Django + Bootstrap 개발 일지' 카테고리의 다른 글
29. 사용자 아바타 구현 (0) | 2022.09.15 |
---|---|
28. Pagination (여러 페이지에 나누어 보여주는 기능) (2) | 2022.09.13 |
26. 폼으로 댓글 기능 구현(댓글 작성 폼 구현) (0) | 2022.09.03 |
25. 폼으로 댓글 기능 구현(Comment 모델, 상세 페이지에 댓글 기능 반영) (0) | 2022.08.30 |
24. 외부 라이브러리를 블로그에 활용(회원가입 & 로그인 기능 구현) (0) | 2022.08.26 |