使用 AJAX 获取一个django.utils.datastructures.MultiValueDictKeyError

yqyhoc1h  于 2022-12-24  发布在  Go
关注(0)|答案(1)|浏览(100)

我尝试使用 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 %}
vmdwslir

vmdwslir1#

使用request.POST[]是针对通过常规HTML表单发送的数据,但不适用于使用 AJAX 发送数据(即使是通过POST发送)。要访问它,您需要原始的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为空,因此键nameemailcontent或任何其他键可能会引发MultiValueDictKeyError:
来源:Django文档:

HTTP请求正文

原始HTTP请求正文作为字节串。这对于以不同于传统HTML表单的方式处理数据很有用:二进制图像、XML有效负载等。要处理常规表单数据,请使用HttpRequest.POST

相关问题