[Django] Shopping Mall (13)
장바구니 결제하기
테스트 도중에 로그인하지 않은 상태에서 체크아웃 버튼을 누르면
체크아웃은 로그인을 한 상태에서만 진행이 되므로 로그인 페이지로 연결되고
로그인이 되면 대시보드로 리다이렉팅 되기 때문에 다시 결제 창으로 가야 되는 번거로움이 있었다.
이 부분을 해결하기 위해서 reuqests
라이브러리를 사용했다.
pip install reqeusts
이 라이브러리는 python용 HTTP 라이브러리다. 사용법
views.py> accounts
def login(request):
if request.method == 'POST':
....
...
..
.
auth.login(request, user)
messages.success(request, "You are new logged in.")
url = request.META.get('HTTP_REFERER')
try:
query = requests.utils.urlparse(url).query
print('query -> ', query)
print('---------')
# next=/cart/checkout/
params = dict(x.split('=') for x in query.split('&'))
print('params -> ', params)
if 'next' in params:
nextPage = params['next']
return redirect(nextPage)
except:
return redirect('dashboard')
else:
messages.error(request, 'Invalid login credentials')
return redirect('login')
return render(request, 'accounts/login.html')
해당 라이브러리로 로직을 체크하면 로그인을 하지 않은 상태에서 결제창으로 넘어갈 때의 파라미터는 query -> next=/cart/checkout/
이런 식의 결과를 얻는다.
그럼 위와 같은 경로가 찍힐 때 대시보드가 아닌 결제페이지로 보내기 위해서
try 문으로 문제를 해결해 주면 된다.
그리고 로그인 후 결제 창으로 넘어갔을 때 장바구니에 있는 정보를 갖고 오기 위해서 기존의 로직도 아래와 같이 변경해 준다.
views.py>carts
@login_required(login_url='login')
def checkout(request, total=0, quantity=0, cart_items=None):
try:
tax=0
grand_total=0
if request.user.is_authenticated:
cart_items = CartItem.objects
.filter(user=request.user, is_active=True)
else:
cart = Cart.objects.get(cart_id=_cart_id(request))
cart_items = CartItem.objects.filter(cart=cart, is_active=True)
for cart_item in cart_items:
total +=(cart_item.product.price * cart_item.quantity)
quantity += (cart_item.quantity)
tax = int(total * 0.1) # 부가가치세
grand_total = tax + total
except ObjectDoesNotExist:
pass
context = {
'total': total,
'quantity': quantity,
'cart_items': cart_items,
'tax' : tax,
'grand_total': grand_total,
}
return render(request, 'store/checkout.html', context)
이렇게 되면 로그인이 되었을 때 와 그렇지 않을 때의 예외 상황 모두 해결할 수 있다. (사실 정상적인 경로라면 else문이 실행될 일은 없다.
댓글남기기