#25 추천 기능
이번에는 사용자가 게시글이나 답글에 추천(좋아요)을 할 수 있는 기능을 추가해본다.
1. 모델 변경
당연히 먼저 Question 모델과 Answer 모델에 추천기능에 사용될 속성을 추가해야한다.
pybo/models.py 에서 Question, Answer 모델에 voter 속성을 추가한다. 그런데 저상태로는 마이그레이션 시에 에러가 발생한다. User 모델에 연결된 속성이 author 와 voter 로 두 개이기 때문에 User 모델을 통해 Question 이나 Answer
인스턴스에 접근할 때 둘 중 어느것을 참조해야할지 모호해지기 때문이다.
이를 해결하기 위해 author 와 voter 속성에 각각 related_name 인자를 추가해줘야 한다. 이제 어떤 유저가 작성한 게시글을 볼 때는 user.author_question.all(), 추천한 게시글을 볼 때는 user.voter_question.all() 과 같이 표현할 수 있다.
모델 수정이 완료되었으니 makemigrations 와 migrate 명령어를 실행하여 마이그레이션을 수행해준다.
2. 게시글 추천
이제 본격적으로 게시글 추천 기능을 만들어야 한다. 먼저 게시글 상세페이지에 추천 버튼부터 생성해보자.
먼저 추천영역과 기존의 게시글 내용과 답글을 표시하던 영역을 분리하기 위해 더 큰 영역을 만들어 추천 영역을
col-1 속성으로, 기존 부분을 col-11 속성으로 하는 것으로 추천:기존내용의 비율이 1:11로 나타나도록 하였다.
추천 링크의 href 값을 #으로 하고 data-uri 인자를 넣은 것으로 알 수 있듯이 여기서도 자바 스크립트 코드를 사용하여
정말 추천할것인지 확인창을 띄울 것이다. 삭제를 위해 만들었던 코드에서 메시지 내용을 수정하고 .delete 를
.recommend 로 수정하는 것으로 간단하게 기능을 구현할 수 있다.
pybo/urls.py 에 vote_question 에 해당하는 url 매핑도 추가해준다. 이전 게시글에서 views.py 파일을 분리했기 때문에
아직 생성하진 않았지만 뷰 함수인 vote_question 이 정의될 vote_views.py 파일의 import 문을 작성하고 vote_views.py
에 정의된 뷰 함수임을 명시하며 매핑을 추가해준다.
그리고 실제로 views 디렉토리에 vote_views.py 파일을 위와 같이 작성한다. 추천 또한 로그인한 사용자만이 게시글마다
1인당 한번에 한해서 추천이 가능하도록 하며 본인이 작성한 게시글을 추천하려고 할 경우 에러메시지를 출력한다.
작업이 끝나면 게시글 상세 페이지로 리다이렉트 시켜준다.
이제 게시글 본문 옆에 받은 추천 수와 추천 버튼이 생겼음을 확인할 수 있다.
추천 버튼을 누르면 추천할 것인지 확인 메시지가 나타나며
본인의 게시글을 추천할 경우 에러메시지가 표시된다.
다른 계정으로 로그인하여 추천할 경우 정상적으로 추천수가 올라가는 것을 확인할 수 있다.
3. 답글 추천
게시글 추천을 이미 구현해보았으니 답글 추천을 구현하는 것도 간단하다. 빠르게 구현해보자.
모델의 수정은 이미 게시글 추천을 구현할 때 마쳐두었기 때문에 바로 추천 영역을 만들어준다. 게시글 때와 완전히
같은방식으로 작성하고 question.voter.count 를 answer.voter.count 로, data-uri 값에서 uri 매핑과 넘겨줄 id를
answer 에 해당하는 것으로 바꿔주면 된다.
pybo/urls.py 에 url 매핑도 추가해준다.
vote_views.py 에 vote_answer 함수를 위와 같이 구현해준다. 게시글 추천 함수에서 question 을 answer 로 바꿔주는
것만으로 완성이지만 redirect 시에 question_id 를 통해 게시글 상세 페이지로 이동해야 하기 때문에 answer.id 가
아니라 answer.question.id 를 넘겨주는 것에만 주의하면 된다.
이제 답글에도 정상적으로 추천기능이 동작하는 것을 확인할 수 있다.
4. 게시글 목록 페이지에서 추천수 표시하기
게시글 목록 페이지에서도 추천수가 표시되도록 수정해보자.
question_detail.html 에서 테이블 헤더에 추천 항목을 추가하고 badge 형태로 question.voter.count 를 표시하도록 한다.
수정하는 김에 가운데 정렬 해주는 것이 보기 좋은 항목들은 가운데 정렬하여 표시하도록 수정해주었다.
이제 게시글 목록 페이지에서 게시글의 추천 수를 볼 수 있다.