# 18 Django - 찜하기 기능

박종규·2021년 8월 15일
1

TIL

목록 보기
19/22

목적

상품 상세 페이지에서 찜하기 버튼을 눌렀을 경우,
비회원일 경우, 찜하기 표시 Off + 로그인이 필요합니다.
회원일 경우, 해당 상품을 찜했는지 상세 페이지에서 확인 할 수 있어야 한다.

구조

처음에는 클래스를 별도로 만들고 상세페이지 뷰에서 조건을 지정하여
회원일 경우에는 데코레이터를 지나서 유무를 확인하고,
비회원일 경우에는 False를 반환하도록 만들었다.
하지만 유지관리 측면에서 불리하므로 뷰를 별도로 분리해서 만들었다.

비회원 상세페이지 View

class ProductPublicView(View):
    def get(self, request, product_id):
        if not product_id.isdigit():
            return JsonResponse({"ERROR": "NEED_NUMBER"}, status=400)

        if not Product.objects.filter(id=product_id).exists():
            return JsonResponse({"ERROR": "DOES_NOT_EXIST"}, status=400)

        product = Product.objects.get(id=product_id)

        item = [{
            "id"           : product.id,
            "name"         : product.name,
            "price"        : product.price,
            "thumbnail"    : product.thumbnail,
            "brand"        : product.brand.name,
            "type"         : product.type.name,
            "detail_image" : product.detail_image,
            "element"      : product.element,
            "weight"       : product.weight,
            "liked"        : False
        }]

        return JsonResponse({"item": item}, status=200)

회원 상세페이지 View

class ProductPrivateView(View):
    @login_decorator
    def get(self, request, product_id):
        if not product_id.isdigit():
            return JsonResponse({"ERROR": "NEED_NUMBER"}, status=400)

        if not Product.objects.filter(id=product_id).exists():
            return JsonResponse({"ERROR": "DOES_NOT_EXIST"}, status=400)

        product = Product.objects.get(id=product_id)

        item = [{
            "id"          : product.id,
            "name"        : product.name,
            "price"       : product.price,
            "thumbnail"   : product.thumbnail,
            "brand"       : product.brand.name,
            "type"        : product.type.name,
            "detail_image": product.detail_image,
            "element"     : product.element,
            "weight"      : product.weight,
            "liked"       : product.like_set.filter(member_id=request.member.id).exists()
        }]

        return JsonResponse({"item": item}, status=200)

0개의 댓글