원래는 Like DB를 사용을 해서 코드를 구현을 하려고 했다.
하지만 좋아요 기능은 조건이 필요하다.
1. 한 계정이 한 번 누르면 올라가지만 한 번 더 누르면 증가해서는 안 된다.
2. 좋아요 버튼을 한 번 더 누를 시에 증가가 아닌 감소를 하게 만든다.
위의 조건을 만족을 시켜주기 위해 좋은 기능이 없을까 하고 구글링을 해본 결과 다대다 관계라는 것을 알게 되었다.
한 명의 사용자가 여러 개의 게시물을 좋아할 수 있고, 한 개의 게시물이 여러 명의 사용자에 의해 좋아질 수 있는 경우라는 것이다. 그리고 그럴 때 ManyToManyField를 사용하여 구현을 할 수 있다고 하길래 DB를 수정을 해주었다
기존 Post_information DB에 아래 코드를 추가해주었다.
like_users = models.ManyToManyField(User_information,default=1, related_name='post_like_user',blank =True)
이 코드를 추가하고 makemigrations와 migrate를 하는데 django.db.utils.IntegrityError: 이 문제가 계속 발생해서 구글링을 해보았다.
다양한 방법이 있었지만 기존에 존재하던 아이디를 삭제를 하니 문제가 해결이 되었다. ( 좋은 해결방안은 아니라고 한다. )
def post_like(request, pk):
print('like')
post = get_object_or_404(Post_information, pk=pk)
user_id = request.session.get('username')
user = User_information.objects.get(username=user_id)
if post.like_users.filter(pk=user.pk).exists():
post.like_users.remove(user)
return redirect('post_detail', pk=pk)
else:
post.like_users.add(user)
그리고 위와 같이 코드를 구현을 해주었다. 만약 유저가 눌렀다면 좋아요를 취소하고 누른 정보가 없다면 추가하라는 조건문이다.
like_count = post.like_users.count()
context = {
'like_count':like_count, #좋아요 카운팅
}
return render(request, 'book/post_detail.html', context)
위 코드는 post_detail 함수이다. 좋아요를 눌렀을때 숫자를 표시해주기 위해서 context값에 담아서 보내주었다.
<div>
<form method="post" action="{% url 'post_like' post.pk %}" style="display:inline;">
{% csrf_token %}
<button type="submit">좋아요</button><p>좋아요 수: {{ like_count }}</p>
</form>
</div>
위와 같이 구현함
'장고' 카테고리의 다른 글
개발 일지 15 - 게시글 좋아요 순으로 정렬 + 페이지 바뀔 때 정렬 유지 (0) | 2024.08.29 |
---|---|
개발 일지 14 - 게시글 조회수로 정렬 (0) | 2024.08.28 |
개발 일지 13 - 댓글 좋아요 기능 (0) | 2024.08.27 |
개발 일지 11 - 댓글 수정, 삭제 기능 추가 (0) | 2024.08.25 |
개발 일지 10 - 댓글 기능 문제 해결 (0) | 2024.08.24 |