Почему у меня есть редирект / обновление с помощью Ajax - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь использовать Django с XMLHttpRequest, попробуйте отправить без обновления страницы.Но у меня ошибка в консоли электронной почты не определена.

Это моя форма> имя, адрес электронной почты, адрес, текст

order_create.html

<h2>Create order</h2>
<form method="POST" id="post_form">
    {% csrf_token %}
    {{form.as_p}}
    <button id="button">Submit</button>
</form>

После того, как я попробую использовать Javascript с XMLHttpRequest


document.getElementById('post_form').addEventListener('submit', event => {

    event.preventDefault();

    var body = 'name=' + name + "&email=" + email + "&address=" + address + "&text=" + text;


    var xhr = new XMLHttpRequest();
    xhr.open('POST', '/order/', true);
    xhr.send(body); 

    xhr.onload = function() {
        var jsonResp = JSON.parse(this.response);
        if (this.status == 200) {
            alert(jsonResp);
        } else {
            alert('ERROR');
        }
    }

});

urls.py

urlpatterns = [
    url(r'^order/$', views.order_create, name='order_create')
]

views.py

def order_create(request):
    cart = Cart(request)
    if request.method == 'POST':
        form = OrderCreateForm(request.POST)
        response_data = {}
        if form.is_valid():
            order = form.save()
            for item in cart:
                OrderItem.objects.create(
                    order=order,
                    product=item['product'],
                    price=item['price'],
                    quantity=item['quantity']
                )
            cart.clear_session()

        return JsonResponse(json.dumps(response_data), content_type="application/json", safe=False)
    else:
        form = OrderCreateForm()
        return render(request, 'orders/order_create.html', {'cart':cart, 'form':form})

В консоли есть ошибка, адрес электронной почты не определен

Ответы [ 2 ]

3 голосов
/ 13 мая 2019

«Перенаправление / обновление», о котором вы говорите, - это форма, выполняющая операцию по умолчанию: отправка формы.Это приводит к тому, что браузер уходит со страницы, останавливая дальнейшее выполнение JavaScript.

Чтобы предотвратить это и заставить вместо этого запускать ваш AJAX-код при отправке, используйте element.addEventListener(), чтобы прикрепитьsubmit событие в элементе формы.В обработчике используйте event.preventDefault(), чтобы предотвратить выполнение формой операции отправки формы по умолчанию.

referenceToForm.addEventListener('submit', event => {
  // Prevent the default behavior of the element. In the case of forms,
  // the act of submitting form data.
  event.preventDefault()

  // The rest of your event handling code

})
1 голос
/ 14 мая 2019

    <h2>Create order</h2>
     <form method="POST" id="post_form">
        {% csrf_token %}
        {{form.as_p}}
        <button id="button">Submit</button>
     </form>

let form = document.querySelector("form");
form.addEventListener("submit", (event)=>{

   // This will help you to diable the defaut property of the form, And stops refresing on the submit 

   if(event && event.preventDefault){
      event.preventDefault();
   }

   let formData = new FormData(form)

   //This code will iterate data from the input elements from your form
   let postData = {};

   for(let [key, val] of formData.entries()){
    if(val) postData[key] = val;
   }


   postData(event.target.action, postData)
  .then(data => console.log(JSON.stringify(data))) 
  .catch(error => console.error(error));
})

function postData(url = '', data = {}) {
  // Default options are marked with *
    return fetch(url, {
        method: 'POST', // *GET, POST, PUT, DELETE, etc.
        mode: 'cors', // no-cors, cors, *same-origin
        cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
        credentials: 'same-origin', // include, *same-origin, omit
        headers: {
            'Content-Type': 'application/json',
            // 'Content-Type': 'application/x-www-form-urlencoded',
        },
        redirect: 'follow', // manual, *follow, error
        referrer: 'no-referrer', // no-referrer, *client
        body: JSON.stringify(data), // body data type must match "Content-Type" header
    })
    .then(response => response.json()); // parses JSON response into native Javascript objects 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...