리스트 커스텀 버튼

Codren·2021년 5월 26일
1

Django Admin

목록 보기
7/13

Section 1. 리스트 커스텀 버튼 추가

1. 리스트 페이지 changelist-form

  • 리스트 페이지의 '실행' 버튼을 누르면 해당 영역의 changelist-form이 submit (POST request) 됨




2. admin.py 수정 (1)

  • action 필드 (Button) 추가
  • 어떤 order 행의 환불 버튼이 눌렸는지에 대한 정보를 보내기 위해 해당 Button 을 누르면 order_refund_submit 함수에 해당 행의 id 값을 인자로 보냄

  • 결과 화면




3. order_change_list.html 생성

  • order/templates/admin/order_change_list.html 생성
  • django 의 admin/change_list.html 상속
  • 부모의 { extrahead block } 수정, 부모의 extrahead 부분을 그대로 받기 위해 {{ block.super }}
  • changelist-form 에 태그 추가 (append)

function order_refund_submit(obj_id)	# obj_id를 매개변수로 받는 함수

# id = changelist-form에 value를 obj_id로 설정한 input 태그를 추가
jQuery("#changelist-form").append('<input type="hidden" name="obj_id" value="' + obj_id + '">');		
jQuery("#changelist-form").submit(); 	# 해당 폼을 submit (POST request)




4. admin.py 수정 (2)

  • 위에서 만든 template 지정
    - changelist 페이지는 해당 template을 사용하도록 지정




5. admin.py 수정 (3)

  • changelist_view 수정
  • POST 요청에서 환불 버튼이 눌린 행의 id 값을 추출하여 행을 불러온 뒤 환불 작업 수행

  • 환불 버튼을 눌러 POST 요청을 보낼 시 보내지는 값




6. 동작 과정 (원리)

    ① 환불하고 싶은 주문 항목의 환불 버튼을 누르면 order_refund_submit 함수로 해당 행의 pk 값이 전달
    ② order_refund_submit 함수에서 changelist-form 폼에 태그를 추가하고 submit (POST request)
    ③ changelist_view에서 POST.get('obj_id')를 통해 주문항목의 pk 값을 얻어 해당 행 추출
    ④ 환불 작업 진행




error


1. 쿼리셋 [] index로 접근하여 환불 작업 수행 시 error

  • qs 는 추출된 행(들)을 묶는 객체이고 qs[index]가 행임 (update 함수는 qs 객체로 사용해야함)
  • qs 로 반환되는 행은 하나뿐이라서 for 문을 돌리지 않고 직접 [0] 인덱스로 접근해봄
  • 왼쪽 코드는 잘 수행되지만 오른쪽 코드는 product.stock += quantity 가 수행되지 않음

  • obj 와 qs[0] 의 데이터 타입과 값은 아래와 같이 동일함에도 덧셈 작업이 수행되지 않음

  • 하지만 아래와 같이 qs로 for문을 돌리고 상관없는 i로 받아도 제대로 환불 작업이 수행됨

  • 결론 - 이유를 모르겠다.

0개의 댓글