6번째 줄: |
6번째 줄: |
| ==모델 수정== | | ==모델 수정== |
| 기존 글의 모델에 다음과 같이 필요한 속성을 추가한다.<syntaxhighlight lang="python"> | | 기존 글의 모델에 다음과 같이 필요한 속성을 추가한다.<syntaxhighlight lang="python"> |
− | voter = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True,null=True) | + | voter = models.ManyToManyField(settings.AUTH_USER_MODEL) |
| + | like_count = models.IntegerField(default=0) # 불필요한 연산 없이 진행하기 위해. |
| </syntaxhighlight>그런데, 이렇게 수정하고 DB에 반영하면 에러가 뜬다. 게시글의 작성자와 voter에 들어가는 사람이 둘 다 User모델을 참조하기 있기 때문에 User모델로 하위모델에 접근하려고 할 때 작성자를 기준으로 찾아야 할지, 추천자를 기준으로 찾아야 할지 정해지지 않기 때문이다. | | </syntaxhighlight>그런데, 이렇게 수정하고 DB에 반영하면 에러가 뜬다. 게시글의 작성자와 voter에 들어가는 사람이 둘 다 User모델을 참조하기 있기 때문에 User모델로 하위모델에 접근하려고 할 때 작성자를 기준으로 찾아야 할지, 추천자를 기준으로 찾아야 할지 정해지지 않기 때문이다. |
| | | |
12번째 줄: |
13번째 줄: |
| ===혹은 이런 모델..=== | | ===혹은 이런 모델..=== |
| 위처럼 해당 객체 아래에 다대다 관계를 만들어 연동할 수도 있지만, 다음과 같이 모델 자체를 따로 만드는 방법도 있다. | | 위처럼 해당 객체 아래에 다대다 관계를 만들어 연동할 수도 있지만, 다음과 같이 모델 자체를 따로 만드는 방법도 있다. |
| + | |
| + | (기본적으로 다대다 관계에선 참조테이블을 자동으로 만들지만, 직접 만들 수도 있다.(이유는 모르겠지만, 대부분 직접 만든다.)) |
| | | |
| 복잡한 모델을 구현할 땐 다음과 같이 중간모델을 만들기도 한다. 바로 ManyToMany로 잇기보단, 다음과 같이 중간모델을 만드는 게 일반적이다.<syntaxhighlight lang="python"> | | 복잡한 모델을 구현할 땐 다음과 같이 중간모델을 만들기도 한다. 바로 ManyToMany로 잇기보단, 다음과 같이 중간모델을 만드는 게 일반적이다.<syntaxhighlight lang="python"> |
33번째 줄: |
36번째 줄: |
| </syntaxhighlight> | | </syntaxhighlight> |
| ==뷰 추가== | | ==뷰 추가== |
− | ManyToMany 필드는 add함수를 사용하여 추천인을 추가해야 한다.<syntaxhighlight lang="python"> | + | ManyToMany 필드는 add함수를 사용하여 추천인을 추가해야 한다. |
| + | |
| + | === 참조테이블을 자동으로 생성한 경우 === |
| + | <syntaxhighlight lang="python"> |
| + | @login_required() |
| + | def posting_like(request, posting_id): |
| + | posting = get_object_or_404(Posting, pk=posting_id) |
| + | if posting.like_users.filter(id=request.user.id).exists(): |
| + | posting.like_users.remove(request.user) # 이미 추가되어 있다면 삭제한다. |
| + | posting.like_count -= 1 |
| + | posting.save() # save가 있어야 반영된다. |
| + | else: |
| + | posting.like_users.add(request.user) # 포스팅의 likeUser에 user를 더한다. |
| + | posting.like_count += 1 |
| + | posting.save() |
| + | return redirect('scientific_humor:detail', posting_id=posting_id) |
| + | |
| + | </syntaxhighlight> |
| + | |
| + | === 중간 참조테이블을 직접 정의한 경우 === |
| + | <syntaxhighlight lang="python"> |
| @login_required(login_url='membership:login') | | @login_required(login_url='membership:login') |
| def vote_question(request, question_id): | | def vote_question(request, question_id): |
43번째 줄: |
66번째 줄: |
| question_like.delete() # 삭제한다. | | question_like.delete() # 삭제한다. |
| return redirect('pool:detail', question_id=comment.answer.question.id) | | return redirect('pool:detail', question_id=comment.answer.question.id) |
− | </syntaxhighlight>동일한 글을 여러번 추천하더라도 추천수가 증가하진 않는다. 중복은 허락되지 않기 때문. | + | </syntaxhighlight>동일한 글을 여러 번 추천하더라도 추천수가 증가하진 않는다. 중복은 허락되지 않기 때문. |
| | | |
| ==탬플릿 수정== | | ==탬플릿 수정== |
53번째 줄: |
76번째 줄: |
| 적당한 곳에 다음과 같은 코드를 담는다.<syntaxhighlight lang="html+django"> | | 적당한 곳에 다음과 같은 코드를 담는다.<syntaxhighlight lang="html+django"> |
| <div class="text-center">추천한 사람 수:{{question.voter.count}}</div> | | <div class="text-center">추천한 사람 수:{{question.voter.count}}</div> |
| + | </syntaxhighlight>이 경우에 모델에서 정의했던 like_count는 지워도 된다. like_count를 이용하는 경우 바로 question.like_count를 넣으면 된다. |
| + | |
| + | === 추천 여부에 따라 버튼 다르게 나타내기 === |
| + | <syntaxhighlight lang="html+django"> |
| + | {% if user in post.like_user_set.all %} <!--추천 모델 안에 유저가 있다면..--!> |
| + | <div class = 'like-btn active' ..... |
| + | {% else %} |
| + | <div class = 'like-btn' ..... |
| + | {% endif %} |
| </syntaxhighlight> | | </syntaxhighlight> |
| + | |
| + | = 마침 = |
| + | 위 작업은 추천 데이터의 반영을 창을 새로 고침으로써 수행했다. 실시간, 비동기 반영을 원하면 [[장고 실시간 추천]] 문서를 참고하도록 하자. |
| + | [[분류:장고 기능구현(초급)]] |