2023. 12. 3. 21:28ㆍWeb/Flask
이번에는 질문과 답변에 "추천(좋아요)" 기능을 추가해 보자
모델 변경
질문이나 답변에 "추천"을 적용하려면 질문 모델과 답변 모델에 "추천인" 이라는 속성을 추가해야 한다
하나의 질문에 여러명이 추천할 수 있고 한 명이 여러개의 질문에 추천할 수 있으므로
이런 경우에는 "다대다(N:N)" 관계를 의미하는 ManyToMany 관계를 사용해야 한다
question_voter
SQLAlchemy에서 ManyToMany 관계를 적용하는 방법에 대해서 알아보자
먼저 다음과 같은 question_voter 테이블 객체를 작성해보
ManyToMany 관계를 적용하기 위해서는 db.Table을 통해 N:N 관계를 의미하는
테이블을 먼저 생성해야 한다
question_voter는 사용자 id와 질문 id를 쌍으로 갖는 테이블 객체이다
사용자 id와 질문 id가 모두 PK(프라이머리키)이므로 ManyToMany 관계가 성립된다
아래 같은 데이터들이 만들어 질 수 있다
user_id | question_id |
1 | 1 |
1 | 2 |
1 | 3 |
2 | 1 |
2 | 2 |
2 | 3 |
하나의 계정(예:user_id가 "1")이 여러개의 질문을 가질 수 있고 반대로
하나의 질문이 여러개의 계정을 가질 수 있는 구조이다
하지만 아처럼 중복된 데이터는 가질 수 없다
user_id | question_id |
1 | 1 |
1 | 1 |
user_id와 question_id 는 프라이머리키이므로 두개의 값이 모두 같은 데이터는 저장될 수 없다
만약 프로그램에서 이렇게 중복된 데이터를 저장하려고 시도하면 데이터베이스 차원에서 오류가 발생할 것이다
Question 모델에 voter 속성 추가하기
Question 모델에 다음과 같이 voter 속성을 추가하자
Question 모델에 추가한 voter는 추천인이므로 기본적으로 User 모델과 연결된 속성이다
여기서 봐야할 점은 secondary 값으로 위에서 생성한 question_voter 테이블 객체를 지정해 주었다는 점이다
이렇게 하면 Question 모델을 통해 추천인을 저장하면 실제 데이터는
question_voter 테이블에 저장되고 저장된 추천인 정보는 Question 모델의
voter 속성을 통해 참조할수 있게 된다
voter의 backref 이름은 question_voter_set 으로 지정해 주었다
만약 어떤 계정이 a_user 라는 객체로 참조되었다면 a_user.question_voter_set 으로
해당 계정이 추천한 질문 리스트를 구할수 있다
Answer 모델에 voter 속성 추가하기
마찬가지 방법으로 테이블 객체 answer_voter를 생성한 후
Answer 모델에 voter 속성을 추가하여 연결하자
migrate, upgrade 명령 입력
모델이 변경되었으므로 migrate, upgrade 명령을 입력하자
질문 추천 버튼 만들기
질문 추천 버튼은 상세화면에 추가하자
질문의 추천 버튼을 질문의 수정 버튼 좌측에 추가했다
그리고 버튼에는 추천수도 함께 보이도록 했다. 추천 버튼을 클릭하면 href의 속성이
javascript:void(0)으로 되어 있기 때문에 아무런 동작도 하지 않는다
하지만 class 속성에 "recommend"를 추가하여 자바스크립로 data-uri에 정의된 URL이 호출되게 할 것이다
같은 방법을 사용하는 이유는 "추천" 버튼을 눌렀을때 확인창을 통해 사용자의 재확인을 하기 위함이다
추천 스크립트
<추천> 버튼을 클릭했을 때 '정말로 추천하시겠습니까?'라는
확인 창이 나타나야 하므로 다음 코드를 추가하자
추천 버튼에 class="recommend"가 적용되어 있으므로 추천 버튼을 클릭하면 "정말로 추천하시겠습니까?"라는
질문이 나타나고 "확인"을 선택하면 data-uri 속성에 정의한 URL이 호출될 것이다
질문 추천 라우팅 함수
질문 추천시 호출되는 url_for('question.vote', question_id=question.id) URL에 해당하는
라우팅 함수를 다음과 같이 추가하자
질문 추천 확인
질문 상세 화면의 본문 왼쪽을 보면 <추천> 버튼이 생겼을 것이다
답변 추천 버튼 만들기
답변의 추천수를 표시하고
답변을 추천할 수있는 버튼을 질문 상세 템플릿에 아래와 같이 추가하자
답변 추천 라우팅 함수
답변 추천시 호출되는 url_for('answer.vote', answeri_d=answer.id) URL에 해당하는
라우팅 함수를 다음과 같이 추가하자
답변 추천 확인
수정 후 답변 추천 기능도 확인해 보자
정상 작동확
'Web > Flask' 카테고리의 다른 글
[Flask] 3-13 마크다운 기능 적용하기 (0) | 2023.12.03 |
---|---|
[Flask] 3-12 앵커 (1) | 2023.12.03 |
[Flask] 3-10 게시물 수정 & 삭제 (2) | 2023.12.03 |
[Flask] 3-9 글쓴이 표시하기 (1) | 2023.12.03 |
[Flask] 3-8 모델 수정하기 (0) | 2023.12.02 |