[Flask] 3-11 추천 기능 추가하기

2023. 12. 3. 21:28Web/Flask

728x90

이번에는 질문과 답변에 "추천(좋아요)" 기능을 추가해 보자

 

모델 변경

질문이나 답변에 "추천"을 적용하려면 질문 모델과 답변 모델에 "추천인" 이라는 속성을 추가해야 한다

하나의 질문에 여러명이 추천할 수 있고 한 명이 여러개의 질문에 추천할 수 있으므로

이런 경우에는 "다대다(N:N)" 관계를 의미하는 ManyToMany 관계를 사용해야 한다

 

question_voter

SQLAlchemy에서 ManyToMany 관계를 적용하는 방법에 대해서 알아보자

먼저 다음과 같은 question_voter 테이블 객체를 작성해보

[파일명: projects/myproject/pybo/models.py]

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 속성을 추가하자

[파일명: projects/myproject/pybo/models.py]

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 속성을 추가하여 연결하자

[파일명: projects/myproject/pybo/models.py]

 

migrate, upgrade 명령 입력

모델이 변경되었으므로 migrate, upgrade 명령을 입력하자

 

질문 추천 버튼 만들기

질문 추천 버튼은 상세화면에 추가하자

[파일명: projects/myproject/pybo/templates/question/question_detail.html]

질문의 추천 버튼을 질문의 수정 버튼 좌측에 추가했다

그리고 버튼에는 추천수도 함께 보이도록 했다. 추천 버튼을 클릭하면 href의 속성이

javascript:void(0)으로 되어 있기 때문에 아무런 동작도 하지 않는다

하지만 class 속성에 "recommend"를 추가하여 자바스크립로 data-uri에 정의된 URL이 호출되게 할 것이다

 같은 방법을 사용하는 이유는 "추천" 버튼을 눌렀을때 확인창을 통해 사용자의 재확인을 하기 위함이다

 

추천 스크립트

<추천> 버튼을 클릭했을 때 '정말로 추천하시겠습니까?'라는

확인 창이 나타나야 하므로 다음 코드를 추가하자

[파일명: projects/myproject/pybo/templates/question/question_detail.html]

추천 버튼에 class="recommend"가 적용되어 있으므로 추천 버튼을 클릭하면 "정말로 추천하시겠습니까?"라는

질문이 나타나고 "확인"을 선택하면 data-uri 속성에 정의한 URL이 호출될 것이다

 

질문 추천 라우팅 함수

질문 추천시 호출되는 url_for('question.vote', question_id=question.id) URL에 해당하는

라우팅 함수를 다음과 같이 추가하자

[파일명: /projects/myproject/pybo/views/question_views.py]

 

질문 추천 확인

질문 상세 화면의 본문 왼쪽을 보면 <추천> 버튼이 생겼을 것이다

 

 

답변 추천 버튼 만들기

답변의 추천수를 표시하고

답변을 추천할 수있는 버튼을 질문 상세 템플릿에 아래와 같이 추가하자

[파일명: projects/myproject/pybo/templates/question/question_detail.html]

 

답변 추천 라우팅 함수

답변 추천시 호출되는 url_for('answer.vote', answeri_d=answer.id) URL에 해당하는

라우팅 함수를 다음과 같이 추가하자

[파일명: projects/myproject/pybo/views/answer_views.py]

 

답변 추천 확인

수정 후 답변 추천 기능도 확인해 보자

 

정상 작동확

 

728x90

'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