바뀜

둘러보기로 가기 검색하러 가기
986 바이트 추가됨 ,  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모델로 하위모델에 접근하려고 할 때 작성자를 기준으로 찾아야 할지, 추천자를 기준으로 찾아야 할지 정해지지 않기 때문이다.
   35번째 줄: 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):
45번째 줄: 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>동일한 글을 여러 번 추천하더라도 추천수가 증가하진 않는다. 중복은 허락되지 않기 때문.
    
==탬플릿 수정==
 
==탬플릿 수정==
55번째 줄: 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>
+
</syntaxhighlight>이 경우에 모델에서 정의했던 like_count는 지워도 된다. like_count를 이용하는 경우 바로 question.like_count를 넣으면 된다.
    
=== 추천 여부에 따라 버튼 다르게 나타내기 ===
 
=== 추천 여부에 따라 버튼 다르게 나타내기 ===
67번째 줄: 88번째 줄:     
= 마침 =
 
= 마침 =
위 작업은 추천 데이터의 반영을 창을 새로고침으로써 수행했다. 실시간, 비동기 반영을 원하면 [[장고 실시간 추천]] 문서를 참고하도록 하자.
+
위 작업은 추천 데이터의 반영을 창을 새로 고침으로써 수행했다. 실시간, 비동기 반영을 원하면 [[장고 실시간 추천]] 문서를 참고하도록 하자.
 
[[분류:장고 기능구현(초급)]]
 
[[분류:장고 기능구현(초급)]]

둘러보기 메뉴