Вы получаете исключение MultiValueDictKeyError
при открытии этого URL-адреса, потому что, когда request.POST["amount"]
оценивается, он не находит в словаре POST элемента с ключом с именем 'amount'
.
По-видимому, вы хотите secret
view - это представление, которое будет достигнуто только через ajax вызовов, но не будет доступно для пользователя. Если вы этого не хотите, чтобы избавиться от исключения, возникающего, когда не- ajax запросы достигают представления, сделайте следующее:
def secret(request):
amount = request.POST.get("amount")
# ... all your other code
Теперь не имеет значения, если ваше представление используется пользователем или вызовом ajax, это исключение исчезнет.
С другой стороны, документация рекомендует использовать канонический токен csrf, включенный в файлы cookie, когда выполнение метода POST запросов через ajax. Для этого убедитесь, что вы поместили 'X-CSRFToken'
в заголовки HTTP-запроса.
Код JavaScript должен выглядеть примерно так:
/* Create FormData instance and append the field that you want */
let data = new FormData();
data.append('amount', document.getElementById('amount').value);
/* Perform the fetch call */
fetch("{% url 'secret' %}", {
method: 'POST',
body: data,
headers: {'X-CSRFToken': csrftoken}
})
/* Do whatever you do when a response (successful or not) has been received */
.then(response => {
console.log(response);
})
/* Get csrf cookie */
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = cookies[i].trim();
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var csrftoken = getCookie('csrftoken');
Как сказано в docs , вы можете значительно упростить процесс получения повара ie, используя JavaScript Cook ie Библиотеку