장바구니 모델
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 |
---|