AJAX не передает жестко закодированные данные

#javascript #python #json #django #ajax

#javascript #python #json #django #ajax

Вопрос:

У index.js меня есть:

  $("#weather_form").on("submit", function(event){
    event.preventDefault();

    $.ajax({
      url: "/weather/",
      type: "POST",
      data: {type_of_person: "1",
        exercise: "2",
        unit: "3",
        zip_postal: "4"},
      dataType: "json",
      contentType: "json",
      success: function (data){
        alert("success");
      },
      error: function(xhr,errmsg,err) {
        alert("errmsg: "   errmsg   "nerr: "   err   "nxhr.status: "   xhr.status   "nxhr.responseText: "   xhr.responseText);
      }
    });
  });
  

Я получаю следующую ошибку:

введите описание изображения здесь

Итак, мы знаем, что из-за всплывающего окна происходит ошибка функции вызова AJAX. Но почему?

Я специально жестко запрограммировал значения JSON для передачи.

Представление, которое обрабатывает данные AJAX:

 class weather(base.TemplateView):
    template_name = "weather/index.html"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["form"] = forms.input_form()
        return context

    @staticmethod
    def post(request, *args, **kwargs):
        form = forms.input_form(request.POST)

        if form.is_valid():
            # process the data
            type_of_person = form.cleaned_data["type_of_person"]
            exercise = form.cleaned_data["exercise"]
            unit = form.cleaned_data["unit"]
            zip_postal = form.cleaned_data["zip_postal"]

            results_matrix = interface.get_results_matrix(type_of_person, unit, exercise, zip_postal)
           
            return http.JsonResponse({"results_matrix": results_matrix.tolist()}, status=200)
        else:
            return http.JsonResponse({"error": form.errors}, status=400)
  

Вещи, которые я пробовал, но безрезультатно:

  • data: JSON.stringify({type_of_person: "1", exercise: "2", unit: "3", zip_postal: "4"})

Комментарии:

1. Покажите нам представления, в которые вы отправляете данные

2. @BiploveLamichhane Готово! Я обновил представление, которое обрабатывает данные AJAX.

Ответ №1:

Я думаю, что форма не смогла прочитать данные, которые вы отправляете contentType json . Просто удаление этой строки должно сработать. Кроме того, вы должны добавить csrf заголовок к post-запросу. Итак:

 $.ajax({
      url: "/weather/",
      type: "POST",
      data: {
        "csrfmiddlewaretoken": $('[name=csrfmiddlewaretoken]').val(),
        "type_of_person": "1",
        "exercise": "2",
        "unit": "3",
        "zip_postal": "4"
      },
      dataType: "json",
      // contentType: "json", remove this
      success: function (data){
        alert("success");
      },
      error: function(xhr,errmsg,err) {
        alert("errmsg: "   errmsg   "nerr: "   err   "nxhr.status: "   xhr.status   "nxhr.responseText: "   xhr.responseText);
      }
    });
  

Комментарии:

1. Эй, это сработало! В чем разница между dataType и contentType ?

2. Ну, contentType это данные, которые мы отправляем на сервер, и dataType это тип данных, отправляемых с сервера, или данные ответа. Смотрите Здесь для получения более подробной информации.

Ответ №2:

Ну, нет смысла вызывать success , если вы получаете код состояния 400 с сервера.

Ваши данные действительны во внешнем интерфейсе и отправляются на сервер, но они не проходят проверку на сервере (или серверная часть не принимает их должным образом) и, следовательно, возвращает вам 400 неверных запросов.

Любой код ошибки, который находится между 200-299 и отличается от 304, считается ошибкой при выполнении вызова jQuery AJAX.