바뀜

둘러보기로 가기 검색하러 가기
1,507 바이트 추가됨 ,  2022년 5월 16일 (월) 11:17
편집 요약 없음
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>
    
= 마침 =
 
= 마침 =
위 작업은 추천 데이터의 반영을 창을 새로고침으로써 수행했다. 실시간, 비동기 반영을 원하면 [[장고 실시간 추천]] 문서를 참고하도록 하자.
+
위 작업은 추천 데이터의 반영을 창을 새로 고침으로써 수행했다. 실시간, 비동기 반영을 원하면 [[장고 실시간 추천]] 문서를 참고하도록 하자.
 +
[[분류:장고 기능구현(초급)]]

둘러보기 메뉴