-
[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'을 통해 값을 가져올 수 있습니다.
같은 오류로 고생하시는 분이 없길 바랍니다~
반응형'Django 개발' 카테고리의 다른 글
[Pycharm]디버깅 No such file or directory 오류 해결 (0) 2022.05.20 [Docker] No such file or directory: 'docker' 오류 해결 (0) 2022.04.25 [Django] DRF jwt 인증방식을 이용한 로그인, 회원가입 구현하기 (0) 2022.03.28 [Django] postman 로그인 API CSRF token missing 오류 해결 (1) 2022.02.21 [Django] Django serialize를 사용하여 queryset을 json으로 변경하기 (0) 2021.09.02