Получение ошибки 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.

Вернуться на верх