Передача POST-запроса через AJAX, проблема Django
Мое мнение таково:
def creating_profile(request):
if request.is_ajax and request.method == "POST":
array = request.POST.get('nums')
print(request.POST.get('nums'))
else:
print('it's not ajax')
my js:
const RegisterForm = document.forms["RegisterForm"];
const csrftoken = document.querySelector('[name=csrfmiddlewaretoken]').value;
let nums = [1, 2, 3]
RegisterForm.addEventListener('submit', () => {
$.ajax({
headers: { 'X-CSRFToken': csrftoken },
url: '/account/creating-profile/',
type: 'POST',
data: { nums: nums },
success: function (data) {
//
}
});
но он возвращает None
результат print(request.POST.get('nums'))
, я буду рад, если кто-нибудь поможет мне с этим вопросом
Я не очень хорошо знаком с Ajax, но всякий раз, когда я пытаюсь передать данные из формы в представление, я использую FormData:
form_data = new FormData(document.getElementById("RegisterForm"))
Это добавляет все поля формы в словарь, где вы можете получить доступ к значениям по имени поля. Вы можете добавить поверх него, используя .append()
Тогда в своем запросе вы можете использовать
fetch("/account/creating-profile/", {
headers: myHeaders,
body: form_data,
method:"POST"})
И получите его в вашем представлении, используя
nums = request.POST["nums"]
Редактирование :
Ваш JS будет выглядеть следующим образом :
const csrftoken = document.querySelector('[name=csrfmiddlewaretoken]').value;
let nums = [1, 2, 3]
myHeaders = new Headers()
myHeaders.append("X-CSRFToken", csrftoken)
form_data = new FormData(document.forms["RegisterForm"]);
form_data.append("nums", nums) // <-- Here you can add anything to the form data using form_data.append("Key", value)
fetch("/account/creating-profile/", {
headers: myHeaders,
body: form_data,
method:"POST"})
При выполнении этого действия POST на вашем сервере будет выполнен дважды, если вы не предотвратите выполнение POST по умолчанию, вы можете предотвратить это, сделав следующее :
$(function(){
$("#RegisterForm").submit(function(){
return false
})
})
или с помощью слушателя событий и preventDefault (см. документацию : https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)
Вы можете использовать метод getlist()
для доступа к объекту списка из POST следующим образом
def creating_profile(request):
if request.is_ajax and request.method == "POST":
array = request.POST.getlist('nums')
print(array)# this will return [1, 2, 3]
else:
print('it's not ajax')
а по поводу MultiValueDictKeyError он возникает если данные отсутствуют в вашем request.POST['key']
чем вызывает MultiValueDictKeyError решение следующее
использовать метод get()
, который вернет None, если данный ключ не имеет значения, и не вызовет исключения.
Данные для отправки на сервер. Это может быть объект JSON, строка или массив.
data: { "nums": nums }
проверьте это doc.