Django 개발

[Django] Ajax serialize를 사용하여 form 데이터 전송하기

나도개발자 2021. 9. 1. 15:40

ajax를 사용하여 재로딩 없이 폼을 전송하는 기능을 구현하기 위해 serialize를 사용하며 오류로 고생하여 간단히 포스팅합니다. 중요한 부분만 간략히 정리해왔으니 감안하고 참고해주세요!

 

 

Html 코드

<form method="post" id="js-addressForm">
  {% csrf_token %}
  <input type="hidden" name="post_type" value="edit_address">
  <input type="text" name="delivery_name" placeholder="배송지명" maxlength=10>
</form>

...

<div id="js-editAddress">배송지 저장</div>

저는 form 태그 밖에 버튼이 위치해 있어서 submit이 아니라 click 메소드 내에 코드를 구현했습니다. 만약 form 태그 안에 <button type=submit> 방식으로 구현하시는 분들은 js에서 click 메소드 구현이 아니라 submit 메소드를 직접 구현해주시면 될 것 같네요.

 

여기서 주의할 점 : serialize는 input 태그의 name을 기반으로 {key: value} 형태로 변환해주기 때문에 name이 필수입니다.

 

 

JS 코드 (jquery)

function ajax_address_post(post_data, post_url){
  var csrftoken = $("[name=csrfmiddlewaretoken]").val();

  $.ajaxSetup({
    beforeSend: function(xhr, settings) {
      if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
        xhr.setRequestHeader("X-CSRFToken", csrftoken);
      }
    }
  });

  $.ajax({
    type: "POST",
    url: '/user/address/',
    data: post_data,
    success: function(ajax_data) {}
  });
}

$(document).ready(function (){
  $("#js-editAddress").click(function () {
    ajax_address_post($("#js-addressForm").serialize());
  });
});

저는 ajax를 여러번 호출하기 때문에 별도 함수로 구분했는데 클릭 메소드 내에서  $.ajax({}) 부분 구현해주셔도 됩니다. 여기서 포인트는 아까 만들었던 form 태그의 아이디로 $("아이디").serialize()를 data로 넘겨주시는 거에요.

 

이렇게 구현해서 장고 뷰에서 request.POST를 print해봐도 <QueryDict: {}>가 출력되어서 이 에러를 고쳐보려고 이것저것 다 도전해보다 찾은 오류는 바로 form 태그의 중첩이었습니다.

serialize를 form태그를 id로 찾는데 form 태그 내부에 또 form 태그가 있으면 id를 못찾아서 serialize할 대상을 못찾는 문제였습니다.

 

주의할 점 : form 태그를 중첩해서 사용하면 id를 찾지 못하여 serialize가 되지 않는다. 

 

 

View 코드

def change_address_view(request):
  if request.method == 'POST':
    post_type = request.POST.get('post_type')
    if post_type == 'edit_address':
      delivery_name = request.POST.get('delivery_name')

  return JsonResponse({})

이제 아까 ajax에서 요청한 url로 연결되어 있는 view에서 request.POST.get('name'을 통해 값을 가져올 수 있습니다.

 

 

같은 오류로 고생하시는 분이 없길 바랍니다~

반응형