Это первый раз, когда я пишу, я надеюсь, что я делаю это правильно.Я потратил несколько дней на эту проблему, и, кажется, я просто не могу найти решение.
Мне нужно добавить данные в форму перед отправкой.Данные, которые я добавляю, немного сложны, поэтому они должны входить в объект JSON (он включает в себя характеристику ранее нарисованного многоугольника на той же странице).
HTML выглядит так:
<form id="form-submit-data" action="{% url 'app_name:submit-data' %}" method="POST">
{% csrf_token %}
<input type="text" id="input-value" name="my-value">
<input type="submit" value="Confirm">
</form>
После нескольких дней копания я согласился на приведенную ниже реализацию (это следует из ответа Кори Дэниелсон с 61 голосом, размещенным здесь: Как вызвать событие после использования события.protectDefault () ).
Проблема в том, что если я добавлю декоратор @csrf_exempt в функцию моих просмотров, моя форма будет отправлена дважды, один раз с правильно отформатированными данными и один раз, как это выглядит "csrfmiddlewaretoken = 2cYsUn5m50RU1oFwOjPsGpCY5HBelIjQPOOV52KoTpQMWE2zRPzwsDA0UKrI7ZFj & my-value = 35" :
* * * * * * * * * * * * * * * * * * * * * * * * * * * 101 '* * * * * * * * * * * * * Я не могу сделать 10-й запрос, чтобы сделать первый комментарий в моем ответе на запрос (когда я делаю это), когда я пытаюсь добавить 10-й запрос в ответ на запрос, который я пытаюсь добавить в ответ на запрос (10-й) в моем ответе на запрос "в ответ на запрос"Запрещено (токен CSRF отсутствует или неверен.)"ошибка 403, и когда я обновляюсь, я получаю" код 400, сообщение Неверный синтаксис запроса ('{[мои данные отформатированы правильно]} GET [URL страницы, которая имелаформа] HTTP / 1.1 ')".
(Мой браузер принимает файлы cookie. Моя функция просмотра передает запрос методу рендеринга шаблона, и я использую CsrfViewMiddleware (в ответ на сообщение django, на которое я перенаправлен в режиме отладки)).
Здесь ниже мой jQuery (когда я добавляю декоратор @csrf_exempt в моих представлениях):
// flag to know if the preprocessing has been done
var preprocessingDone = false;
// stops forms from submitting, adds data previously gathered and resumes submission
$('#form-submit-data').submit(function(event, options) {
options = options || {};
if (!options.preprocessingDone) {
event.preventDefault();
var formData = gatheredData; // from global var
formData["myValue"] = $('#input-value').val();
$.ajax({
//headers: {'X-CSRFToken': '{{ csrf_token }}'},
url: $(this).attr('action'),
type: 'POST',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(formData),
dataType: 'text',
success: function(data){
console.log("DATA POSTED SUCCESSFULLY" + data);
},
error: function(jqXhr, textStatus, errorThrown){
console.log(errorThrown);
}
}).then(function() {
// retrigger form submit
$(event.currentTarget).trigger('submit', {'preprocessingDone': true});
});
}
});
(тогда как, когда я пытаюсь использовать csrf_token, я удаляю комментарий к аргументу заголовков вызова ajax).
Насколько я понимаю, чтоданные отправляются дважды, один раз с добавленными данными, но без csrf_token, и один раз только с данными формы без добавленных данных, но с csrf_token.
Как добавить дополнительные данные в форму, иметь действительный csrf_token иотправить данные только один раз?Ваш вклад очень важен.
PS: я знаю, что получение данных из глобальной переменной - плохая практика, но на этом я остановился после нескольких дней испытаний.Я не уверен, что это (сбор данных) может быть решено в исходном запросе, поэтому я не обязательно включаю его в вопрос.