인스타그램 기능 중 게시물 좋아요를 구현하려고 했는데 html 파일에서 잘 넘어오지 않는 듯싶었다
제대로 입력받고 있는 건지 아닌지 헷갈리는 부분이 컸고 어찌 따라 해 보면 뭐라도 나올 듯싶으면서도 큰 발전을 이루지 못했다. 내일 다시 한번 해보기 위해 짚어야 할 부분은 적어 보자면,
좋아요는
1. 한 명의 유저는 하나의 게시물에 대해 하나의 좋아요만 할 수 있다
2. 이미 누른 좋아요 버튼을 다시 누르면 좋아요가 해제된다
3. 좋아요를 누르면 해당 포스팅의 좋아요 개수가 변한다
좋아요 기능은 게시물과 관련이 있으니 post 앱에서 작업할 것
모델 예시
from django.db import models
from user.models import User
(..생략)
class Like(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
user = models.ForeignKey('user.User', on_delete=models.CASCADE)
posting = models.ForeignKey('Posting', on_delete=models.CASCADE)
class Meta:
db_table = 'likes'
해당 유저가 해당 게시물에 이미 좋아요를 눌렀는지 filter()와 exists()로 확인한다
만약 매칭되는 데이터가 있다면 delete()로 삭제한다. 좋아요 개수는 count()로 계산하여 JsonResponse로 응답할 때 함께 보낸다
모델을 생성 및 변경한 후에는 위 고려사항을 반영하여 view를 수정한다
view 예시
import json
from json.decoder import JSONDecodeError
from django.http import JsonResponse
from django.views import View
from posting.models import Posting, Image, Comment, Like --> 수정
from user.models import User
from user.utils import login_decorator
(..생략)
class LikeView(View):
@login_decorator
def post(self, request):
try :
data = json.loads(request.body)
user = request.user
posting_id = data.get('posting_id', None)
if not posting_id:
return JsonResponse({'message':'KEY_ERROR'}, status=400)
if not Posting.objects.filter(id=posting_```
코드를 입력하세요
```id).exists():
return JsonResponse({'message':"POSTING_DOES_NOT_EXIST"}, status=404)
posting = Posting.objects.get(id=posting_id)
if Like.objects.filter(user=user, posting=posting).exists():
Like.objects.filter(user=user, posting=posting).delete()
like_count = Like.objects.filter(posting=posting).count()
return JsonResponse({'message': 'SUCCESS', 'like_count':like_count}, status=200)
Like.objects.create(
user = user,
posting = posting
)
like_count = Like.objects.filter(posting=posting).count()
return JsonResponse({'message': 'SUCCESS', 'like_count': like_count}, status=200)
except JSONDecodeError:
return JsonResponse({'message':'JSON_DECODE_ERROR'}, status=400)
url 경로를 지정한 후 html 파일을 수정한다
경로 예시
urlpatterns = [
(..생략)
path('/like', LikeView.as_view()),
]