추천 기능 만들기

Red_Panda·2021년 4월 3일
0

오늘은 커뮤니티 게시판이라면 필수인 추천 기능을 만든다.

추천기능은 1명이 여러개의 글을 추천, 1개의 글에 여러명이 추천할 수 있다.
그래서 다대다 관계 모델을 사용해야한다.


다대다 관계를 정의하는 db.Table 클래스로 정의되는 테이블 객체를 만들었다.
question_voter는 user_id, question_id 둘다 기본키이다.

user_id : 1일때 question_id : 1 , 2 , 3을 가질 수 있고 2일때도 question_id : 1, 2, 3을 가질 수 있다.
반대로보면 question_id : 1일때 user_id : 1, 2, 3 식으로도 가질 수 있는 것이다.

다만 user_id : 1일때 question_id 가 1인 값을 이미 가지고 있다면 중복데이터 발생으로 오류가 발생한다. 반대의 경우도 마찬가지다.

voter = db.relationship('User', secondary=question_voter, backref=db.backref('question_voter_set'))

Question 모델에 voter 필드를 추가했다. User 모델의 relationship 이다.

relationship :
DB에 설정된 관계들을 SqlAlchemy의 ORM에 명시적으로 선언해 object 형태로 편하게 사용할 수 있다.

secondary에는 아까 만든 테이블 qeustion_voter를 넣어준다. 이는 voter가 다대다 관계이며 question_voter 테이블을 참조 한다는 뜻이다.
그리고 voter는 question_voter_set을 역참조 한다.

https://flask-sqlalchemy.palletsprojects.com/en/2.x/models/
이 페이지 맨 아래에 다대다 관계에 대해 설명하고 있다.

voter = db.relationship('User', secondary=answer_voter, backref=db.backref('answer_voter_set'))

질문 추천과 마찬가지로 models.py에 답글 추천도 테이블 객체를 만든 후, Answer 모델에 voter 필드를 추가한다.

모델이 변경 되었으니 이번에도 당연히 migrate, upgrade를 해준다.


추천영역은 이렇게 class="col-1"을 적용해주고, 질문 영역도 마찬가지로 class="col-11"을 적용해주면 된다.
질문 영역 시작부분을 이렇게 수정 했다.

question_detail.html을 수정해 추천 버튼을 넣었다. row, col-1, col-11을 이용해 추천 영역의 너비는 전체 너비의 1/12, 질문 영역의 너비는 11/12로 만들었다.


그리고 맨밑 script 부분을 수정하여 확인창을 나타냈다.
추천 버튼은 class="recommend" 이므로 해당 $(".recommend")를 이용하고 확인을 누르면 data-uri 속성에 정의한 URL이 호출 된다.


질문 추천 함수를 만들었다. 로그인 상태일때만 추천할 수 있고, 본인이 작성한 글은 추천할 수 없다. 추천인이 생길때마다 append를 이용해 _question.voter에 g.user를 추가한다.
그리고 이미 추천 했다면, 이미 추천한것을 알리기위해 현재 g.user가 _question.voter에 있으면 flash로 오류 처리 해주었다.

__init.py__에 블루 프린트 객체 bp를 등록했다.

question_detail에 질문 추천 함수에서 오류 발생시 오류 메세지 flash를 띄우도록 했다.

본인 글 추천 불가 테스트 화면

중복 추천 불가 알림 테스트 화면


오류 처리를 살짝 수정해 비로그인 상태에서 추천을 하려하면 로그인을 해달라고 문구를 띄우도록 했다.



question.voter의 길이를 이용해 질문 리스트 화면에서 질문글이 받은 추천수도 같이 나타내도록 했다.

답변 추천 기능은 질문 추천 기능과 같은 방식으로 만들면 된다.

profile
신입 개발자

0개의 댓글