쑤야뚜야 2021. 4. 29. 00:08

ajax 사용법

예) 품번이 변경되면 선택된 지점의 재고를 계산해서 출력

 

html의 javascript에 아래 코드 입력

$("select[id=id_itemNumber]").change(function () {
        setStock();
})
function setStock() {
  var item_id = $('#id_itemNumber').val();
  var selected_office = '{{ selected_office }}';

  $.ajax({
    type: "post",
    url: "/ajax_set_stock/",
    data : {'csrfmiddlewaretoken': '{{ csrf_token }}', 'item_id': item_id, 'selected_office': selected_office },
    dataType: "json",

    success: function (response) {
    	$('#id_stock').val( response.sum_qty );
    },
    error: function (request, status, error) {
    	alert('error');
    }
  });
}

// ajax에서 post 타입은 data에서는 CSRF공격에 대한 방어를 위해 'csrfmiddlewaretoken' : '{{ csrf_token }}'을 지정해줘야 error가 안남.

----------------------------------------------------------------------------------------------------------------------------------

파이썬 파일에 (필자는 emport.py파일에 지정)

ajax에서 지정한 url(클래스 명) 생성

class ajax_set_stock(View):
    def post(self, request):
        item_id = request.POST.get('item_id');
        selected_office = request.POST.get('selected_office');
        dic = {}
        
        try:
            iqs = Inventory.objects.filter(itemNumber_id=item_id)
            
        	qs_buy = iqs.filter(flag='매입', storage=selected_office)
            qs_export = iqs.filter(flag='출고', storage=selected_office)
            qs_list = qs_buy | qs_export
            
            sqs = qs_list.values('itemNumber', 'itemNumber__itemNumber').annotate(
                sum_qty=Sum(Case(
                	 When(
                        flag='매입', storage=selected_office,
                        then='quantity'),
                     When(
                        flag='출고', storage=selected_office,
                        then=F('quantity') * (-1)),   
                 ), ).order_by('itemNumber__itemNumber')       
         dic['sum_qty'] = col_round(sqs.first()['sum_qty']) 
     
     except Exception as e:
         dic['sum_qty'] = 0

     return JsonResponse(dic)
     
def col_round(x):
  frac = x - math.floor(x)
  if frac < 0.5: return math.floor(x)
  return math.ceil(x)

매입일 경우 +, 출고일 경우 - 하여 재고를 계산하는 코드입니다.

---------------------------------------------------------------------------------------------------------------------------------

마지막으로 url 파일에 경로를 넣어줍니다.

path("ajax_set_stock/", ajax_set_stock.as_view(), name='ajax_set_stock'),