#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.