본문으로 바로가기

return 할 때 render & redirect 의 차이

category 장고/기타 설정 방법 2019. 2. 17. 23:51

우선 소스코드 참조

장바구니에 상품을 추가하는 코드

(코드가 많이 너저분하지만 핵심은 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