우선 소스코드 참조
장바구니에 상품을 추가하는 코드
(코드가 많이 너저분하지만 핵심은 render 과 redirect 의 차이)
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)
print(cart)
if cart:
if cart.product.name == product.name:
cart.quantity += 1
cart.save()
cart_item = CartItem.objects.filter(user_id=request.user.pk)
print(cart_item)
print(request.user.pk)
except CartItem.DoesNotExist:
user = User.objects.get(pk=request.user.pk)
cart = CartItem(
user=user,
product=product,
quantity=1,
)
cart.save()
cart_item = CartItem.objects.filter(user_id=request.user.pk)
print(f'{cart_item} 은 생성되었습니다.')
return render(request, 'cart/cart-list.html', {'cart_item': cart_item})
# return redirect('productions:my-cart')
render 의 결과값
render 는 템플릿에 새로운 페이지를 뿌려준다(?)는 느낌인데 render 를 이 예시에서 사용하면 발생하는 문제들이 있다.
1. url 주소를 보면 분명 cart/cart-list.html 로 보냈는데, 실제 url 은 add/cart/1/ 과 같은 형식으로 렌더링 됨
2. 새로고침을 하면 해당 페이지에 상품이 있기 때문에 cart.quantity += 1 코드가 실행되어 새로고침을 할 때마다 계속 + 1 이 됨
[새로고침 전]
[새로고침 후]
redirect 결과값
이 상황에서는 redirect 가 옳았다.
함수 내부에서 객체를 save 까지 했으니 단순히 원하는 페이지로 이동만 시켜주면 되는 것이다.
다음 페이지로 이동했기 때문에 새로고침을 해도 해당 페이지의 view 함수가 실행되어 상품+1 카운트 되는 일도 없고,
원했던 cart_list 페이지에 계속 머물러 있음을 확인했다.
redirect 와 render 는 상황에 따라 써야하고, 이 기능 구현을 위해 문서도 많이 찾아봤다. 장고 문서와 스택오버플로우는 항상 옳다.
'장고 > 기타 설정 방법' 카테고리의 다른 글
django.setup() 에러 발생 (0) | 2019.06.10 |
---|---|
(문서 번역)정적 파일 관리 (0) | 2019.02.02 |
SECRET KEY 를 json 으로 따로 관리 (0) | 2018.12.25 |
Media Root 설정하기 (0) | 2018.12.13 |