Получение ошибки django.utils.datastructures.MultiValueDictKeyError при использовании ajax
Я пытаюсь использовать функцию ajax post для публикации данных из контактной формы в одном из моих шаблонов. Однако я получаю ошибку 'django.utils.datastructures.MultiValueDictKeyError', когда делаю запрос.
Ошибка является ошибкой сервера и отображается как показано
django.utils.datastructures.MultiValueDictKeyError: 'name'
Запускается в папке view.py на строке с кодом
name = request.POST['name']
Вот моя модель для сообщения:
class Message(models.Model):
name = models.CharField(max_length=255)
email = models.CharField(max_length=255)
content = models.TextField(max_length=10000)
created_at = models.DateTimeField(auto_now_add=True)
Это мой view.py:
def save_message(request):
if request.method=='POST':
name = request.POST['name']
email = request.POST['email']
content = request.POST['content']
Message.objects.create(
content = content,
name = name,
email = email
)
messages.success(request, f'Your message has been sent. Expect a response soon!')
return JsonResponse({'bool':True})
Это форма в шаблоне индекса
{% csrf_token %}
<form class="contactForm" id="contactForm">
<div class="form-floating">
<input class="form-control" class="message-name" id="name" type="text" placeholder="Enter your name..." />
</div>
<div class="form-floating">
<input class="form-control" class="message-email" id="email" type="email" placeholder="Enter your email..." />
</div>
<div class="form-floating">
<textarea class="form-control" id="message" class="message-text" placeholder="Enter your message here..."></textarea>
</div>
<br />
<button class="btn btn-primary text-uppercase save-message" id="submitButton" type="submit">Send</button>
</form>
А это мой ajax:
{% block script %}
<script>
$(document).ready(function(){
// This is for the post messages for non-logged in users
$(".save-message").on('click',function(){
var _content=$(".message-text").val();
var _messageName=$(".message-name").val();
var _messageEmail=$(".message-email").val();
// Ajax
$.ajax({
url:"/save-message",
type:"POST",
data:{
content:_content,
name:_messageName,
email:_messageEmail,
csrfmiddlewaretoken:"{{csrf_token}}"
},
dataType:'json',
beforeSend:function(){
$(".save-message").addClass('disabled').text('Saving...');
},
success:function(res){
if(res.bool==true){
$(".message-text").val('');
}
$(".save-message").removeClass('disabled').text('submit');
}
});
});
});
</script>
{% endblock %}
Использование request.POST[]
предназначено для данных, отправляемых с помощью обычных HTML-форм, но не при отправке данных с помощью AJAX (даже если они отправляются через POST). Для доступа к ним вам нужен raw, request.body
, а для разбора - json
, что также означает, что вам нужно import json
:
import json
def save_message(request):
if request.method=='POST':
data = json.loads(request.body)
name = data['name']
email = data['email']
content = data['content']
Message.objects.create(
content = content,
name = name,
email = email
)
messages.success(request, f'Your message has been sent. Expect a response soon!')
return JsonResponse({'bool':True})
Ошибка произошла бы при email = request.POST['email']
или content = request.POST['content']
, потому что request.POST
пуст, поэтому ключи name
, email
, content
или любой другой ключ вызвали бы ошибку MultiValueDictKeyError:
.
Источник: Django Docs:
HttpRequest.body
.Необработанное тело HTTP-запроса в виде байтовой строки. Это полезно для обработки данных в формах, отличных от обычных HTML формы: бинарные изображения, полезная нагрузка XML и т.д. Для обработки обычных данных формы, используйте HttpRequest.POST.