Django с Vue, обнаружение ошибки проверки формы - PullRequest
0 голосов
/ 02 мая 2020

У меня есть Django ModelForm, которая отображается в шаблоне с использованием хрустящих форм. После того, как пользователь заполняет поля и нажимает кнопку «Отправить», электронное письмо отправляется на сервер с использованием ядра Django send_email.

Проблема заключается в том, что вызов send_email является синхронным, поэтому пользователь имеет ждать загрузки следующей страницы (страница успеха / неудачи), но в это время пользователь может снова нажать кнопку «Отправить», и это сгенерирует несколько POST, создавая несколько электронных писем.

Я хочу использовать Vue. js, чтобы сделать кнопку неактивной, когда пользователь нажмет ее, но только если она пройдет проверку формы Django. Есть ли способ обнаружить это?

1 Ответ

1 голос
/ 03 мая 2020

Добавить к вашей кнопке: disabled = "! ReadyToSend", где readyToSend может быть возвращен вашей функцией данных или вычисленным свойством.

Перед отправкой формы установите эту переменную в false, после получения данных от вашего API сбросьте его на true.

В следующем примере я решил сделать readyToSend вычисляемый proporty, где он будет возвращать true, если форма верна и если процесс не ожидает ответа API.

Полный пример Code Pen здесь

html файл:

<html>
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <title>example</title>
  </head>
  <body>
    <div id="app">
      <h2>{{ message }}</h2>
      <form @submit.prevent>
        <input type="text" v-model="dataToSend" placeholder="Something to send">
        <button type="button" :disabled="!readyToSend" @click="send">Send</button>
      </form>
    </div>
  </body>
</html>

javascript:

var vm = new Vue({
  el: '#app',
  data: function(){
      return {
       message: "please enter your message and click on send.",
        dataToSend: "",
        sentAndWaiting: false,
      }
  },
  methods:{
    send: async function(){
      this.sentAndWaiting = true;
      // Send Data Here
      this.message = "sending....";
      try{
        let response = await fetch('https://jsonplaceholder.typicode.com/posts/1');
        let jsonResponse = await response.json();
      }
      catch(e){
        this.message = e.message;
      }
      // reponse received ... do Something with it
      this.reponseReceived();
    },
    reponseReceived: function(){
      this.sentAndWaiting = false; 
      this.message = "Ok. Got The response.";
    }
  },
  computed:{
    readyToSend: function(){
      return this.dataToSend.length > 0 && !this.sentAndWaiting;
    }
  },

});

в моем браузере я должен был проверить это, перейдя в инструменты разработчика и ограничив мое inte rnet подключение к GPRS и отключив кеш:

Screenshot DevTools

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...