본문으로 바로가기

장바구니 기능 구현하기

category 프로젝트 이야기/코드 2019. 6. 8. 13:48

장바구니 모델

class CartItem(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    active = models.BooleanField(default=False)
    # 수량은 -1 과 같은 수량이 없기 때문에 아래의 필드로 선언하여 최소값을 1 로 설정
    quantity = models.PositiveSmallIntegerField(null=True, default=1, validators=[MinValueValidator(1), MaxValueValidator(100)])
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name = '장바구니'
        verbose_name_plural = f'{verbose_name} 목록'
        ordering = ['-pk']

    def sub_total(self):
    	# 템플릿에서 사용하는 변수로 장바구니에 담긴 각 상품의 합계
        return self.product.price * self.quantity

    def __str__(self):
        return self.product.name

 

 

장바구니에 상품을 담기

@login_required
def add_cart(request, product_pk):
	# 상품을 담기 위해 해당 상품 객체를 product 변수에 할당
    product = Product.objects.get(pk=product_pk)

    try:
    	# 장바구니는 user 를 FK 로 참조하기 때문에 save() 를 하기 위해 user 가 누구인지도 알아야 함
        cart = CartItem.objects.get(product__id=product.pk, user__id=request.user.pk)
        if cart:
            if cart.product.name == product.name:
                cart.quantity += 1
                cart.save()
    except CartItem.DoesNotExist:
        user = User.objects.get(pk=request.user.pk)
        cart = CartItem(
            user=user,
            product=product,
            quantity=1,
        )
        cart.save()
    return redirect('product:my-cart')

 

장바구니에 담긴 상품들의 합계

@login_required
def my_cart(request):
    """
    각 유저의 장바구니 공간
    """
    cart_item = CartItem.objects.filter(user__id=request.user.pk)
    # 장바구니에 담긴 상품의 총 합계 가격
    total_price = 0
    # for loop 를 순회하여 각 상품 * 수량을 total_price 에 담는다
    for each_total in cart_item:
        total_price += each_total.product.price * each_total.quantity
    if cart_item is not None:
        context = {
        	# 없으면 없는대로 빈 conext 를 템플릿 변수에서 사용
            'cart_item': cart_item,
            'total_price': total_price,
        }
        return render(request, 'cart/cart-list.html', context)
    return redirect('product:my-cart')

 

장바구니 페이지에서 상품 수량 +1

def add_cart(request, product_pk):
    product = Product.objects.get(pk=product_pk)

    try:
        cart = CartItem.objects.get(product__id=product.pk, user__id=request.user.pk)
        if cart:
            if cart.product.name == product.name:
                cart.quantity += 1
                cart.save()
    except CartItem.DoesNotExist:
        user = User.objects.get(pk=request.user.pk)
        cart = CartItem(
            user=user,
            product=product,
            # 장바구니에 해당 상품이 없을 경우 int 1을 선언
            quantity=1,
        )
        cart.save()
    return redirect('product:my-cart')

 

장바구니 페이지에서 상품 수량 -1

def minus_cart_item(request, product_pk):
    cart_item = CartItem.objects.filter(product__id=product_pk)
    product = Product.objects.get(pk=product_pk)
    try:
        for item in cart_item:
            if item.product.name == product.name:
                if item.quantity > 1:
                    item.quantity -= 1
                    item.save()
                return redirect('product:my-cart')
            else:
                return redirect('product:my-cart')
    except CartItem.DoesNotExist:
        raise Http404

 

'프로젝트 이야기 > 코드' 카테고리의 다른 글

회원가입 기능 구현  (0) 2019.06.09