프로젝트 2

·2022년 10월 4일
0

TIL

목록 보기
20/46

인스타그램 기능 중 게시물 좋아요를 구현하려고 했는데 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()),
]

0개의 댓글