ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Django] Ajax serialize를 사용하여 form 데이터 전송하기
    Django 개발 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'을 통해 값을 가져올 수 있습니다.

     

     

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

    반응형

    댓글

Written by 나도개발자.