본문 바로가기

Django/따라하는 장고

25. 추천 기능

먼저 Question 모델에 voter(추천인) 속성을 추가해 보자.

하나의 질문에 여러명이 추천할 수 있고 한명이 여러 개의 질문에 추천할 수 있으므로 다대다, N:N 관계를 의미하는 ManytoManyField 를 사용해야 한다.

projects\mysite\pybo\models.py 파일을 다음과 같이 수정하자.

voter 를 ManytoManyField 관계로 추가했다. 모델을 변경했기 때문에 makrmigrations, migrate 를 해야한다. 

하지만 makemigrations 를 하면 오류가 발생한다. Question 모델에서 사용한 author와 voter 모두 User 모델과 연결되어 있기 때문에 User.question_set 처럼 User 모델을 통해서 Question 데이터에 접근하려고 할 때 author를 기준으로 할지 voter 를 기준으로 해야 할 지 명확하지 않다는 오류이다. 오류의 HINT 에서도 알 수 있듯이 related_name 인수를 추가하여 해결할 수 있다.

projects\mysite\pybbo\models.py 를 수정하자.

author 에는 related_name='author_question' 라는 인수를 지정하고 voter 에는 related_name='voter_question' 라는 인수를 지정했다. 이렇게 하면 특정 사용자가 작성한 질문을 얻기 위해서는 some_user.author_question.all() 처럼 사용할 수 있다. 마찬가지로 특정 사용자가 추천한 질문을 얻기 위해서는 some_user.voter_question.all() 처럼 사용할 수 있다. some_user 는 특정 사용자를 의미한다. 

Answer 모델에도 voter 속성을 다음처럼 추가하자.

projects\mysite\pybo\models.py 를 수정하자.

Answre 모델에도 author, voter 속성에 related_name 인수를 추가했다. 다시 makemigrates 와 migrate 를 실행하자.

오류없이 잘 실행된다.

 

[질문 추천]

 

이제 질문 추천 기능을 만들어보자.

projects\mysite\templates\pybo\question_detail.html 를 수정하자.

질문의 추천 버튼을 질문의 수정 버튼 좌측에 추가했다. 그리고 버튼에는 추천수도 함께 보이도록 했다. 추천 버튼을 클릭하면 href의 속성이 javascript:void(0) 으로 되어 있기 때문에 아무런 동작도 하지 않는다. 하지만 class 속성에 recommend 를 추가하여 자바스크립트로 data-uri 에 정의된 URL이 호출되게 할 것이다. 이와 같은 방법을 사용하는 이유는 추천 버튼을 눌렀을때 확인창을 통해 사용자의 확인을 구하기 위함이다.

그 확인창을 만들어 보자.

projcets\mysite\templates\pybo\question_detail.html 을 수정하자.

오타가 안나게 잘 따라 작성하자

추천 버튼에 class="recommend" 가 적용되어 있으므로 recommend 라는 이름을 가진 클래스가 있으면 명령문이 실행되어 '정말로 추천하시겠습니까?' 라는 확인창이 나오고 확인을 누르면 data-uri 속성에 정의한 URL 이 호출된다.

question_detail.html 에 적은것 처럼 {% url 'pybo:question_vote' question.id %} URL이 추가되었으므로 pybo/urls.py 에 다음처럼 URL매핑 규칙을 추가해야 한다.

projects\mysite\pyob\urls.py 를 수정하자.

그리고 URL 매핑에 의해 실행되는 question_vote 함수도 작성해줘야 한다.

projects\mysite\pybo\views\question_views.py 에 다음과 같이 작성하자.

작성한 것을 보면 알 수 있듯이 로그인한 사용자와 추천하려는 질문의 글쓴이가 같은 유저일 경우 추천할 수 없게 했다. Question 모델의 voter 는 여러사람을 추가할 수 있는 ManyToManyField 이므로 question.voter.add(request.user) 처럼 add 함수를 사용하여 추천인을 추가한다. 동일한 사용자가 동일한 질문을 여러번 추천해도 추천수가 증가하지 않는다. 오류도 발생하지 않는다. 이는 ManyToManyField 내부에서 자체적으로 처리된다. 서버를 재시작해서 테스트를 해보자. 잘 작동되는지 확인하자.

 

[답변 추천]

 

답변 추천도 질문 추천과 동일하다. 먼저

projects\mysite\templates\pybo\question_detail.html 을 작성하자.

{% url 'pybbo:answer_vote' answer.id %} 이 추가 되어 URL 매핑규칙을 추가하자.

projects\mysite\pybo\urls.py 를 수정하자.

URL 매핑에 의해 실행되는 answer_vote 함수를 작성해준다.

projects\mysite\pybo\views\answer_views.py 에 작성해주자.

잘 작동되는지 테스트 해보자.

 

'Django > 따라하는 장고' 카테고리의 다른 글

27. 마크다운  (0) 2022.11.23
26. 앵커  (0) 2022.11.23
24. views.py 분리  (0) 2022.11.21
23. 답변 수정 및 삭제  (0) 2022.11.19
22. 질문 수정 및 삭제  (0) 2022.11.18