Django 쇼핑몰 만들기-6

Sang Jun Park·2021년 2월 15일
0

포트폴리오-STREET

목록 보기
6/6

게으른 과거의 나를 미워하며 과거의 한 일을 다시 복기해서 쓰는 내용(4)


오늘 한 일

1. Cartapp의 Model을 작성함

  • User와 Cart는 1:1관계임
  • 그 Cart와 CartItem은 1:N관계임
  • Cart의 모델 클래스 안 메서드에서 장바구니에 담은 상품들의 총 가격을 가져올 수 있음

2. Cartapp의 CRUD를 구현함

  • 장바구니에 이미 들어가있는 상품이라면 해당 상품의 수량을 +1

  • 상품 삭제시 체크박스를 통해 선택된 상품 삭제시 request.POST.getlist()로 리스트를 받음

  • 상품 수량을 변경하는 기능도 추가함


오늘 알게된 내용

  1. request.POST.getlist('cart_item_list[]', None)
    • 상황은 이렇다.
      list에서 체크된 상품을 선택 삭제하는 기능을 구현하고자
      script단에서 체크된 상품의 PK를 넘겨주도록 코드를 짰고
      서버에서 request.POST.getlist()로 받으면 될 줄 알았다.
      근데 왠걸 계속 None이 들어온다고 오류를 뿜었다.

    • 해결한 방법
      위 제목처럼 getlist()안에 명시하는 변수명(Script에서 post로 던지는)에 []를 넣어 이건 list다 라고 명시하니 작동했다.
    cartapp/view.py
    
	cart_item_list = request.POST.getlist('cart_item_list[]', None)
    
    
    cartapp/list.html
    // 선택된 장바구니 상품 삭제
      function deleteCartItem(){
          checked_item = isChecked();
          if (checked_item) {
              var result = confirm('해당 상품을 장바구니에서 제외할까요?');
              var cart_pk = $('#target_cart').val()
              var cart_item_list = []

              if (result) {
                  for (var i=0; i<checked_item.length; i++) {
                      cart_item_list.push(checked_item[i].value);
                  }

                  $.post('{% url 'cartapp:delete' cart_pk=target_cart.pk %}',
                      {
                          'csrfmiddlewaretoken' : csrftoken,
                          'cart_item_list' : cart_item_list
                      }, function() {
                          alert('삭제완료!');
                          location.reload();
                  });
              }
          } else {
              alert('상품을 선택해주세요!');
          }
      }
  • 추가로 찾아본 정보들

스택오버플로우에서 어떤 글은

        jQuery POST's arrays with the [] suffix because PHP and some web frameworks
        understand that convention, and re-build the array on the server-side for you automatically.
        Django doesn't work that way
               

라고 한다.

  • 해결 할 수 있는 다른 방법
        <input type="text" name="input[]">
        <input type="text" name="input[]">
        <input type="text" name="input[]">

이렇게 아에 마크업을 하는 방법도 있다더라


고민해야할 부분

오늘 내용에서는 잘 모르겠다.

profile
Django 개발자가 되고싶은 사람

0개의 댓글