我尝试使用 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 %}
1条答案
按热度按时间vmdwslir1#
使用
request.POST[]
是针对通过常规HTML表单发送的数据,但不适用于使用 AJAX 发送数据(即使是通过POST发送)。要访问它,您需要原始的request.body
,要解析它,您需要json
,这也意味着您需要import json
:email = request.POST['email']
或content = request.POST['content']
可能会出现此错误,因为request.POST
为空,因此键name
、email
、content
或任何其他键可能会引发MultiValueDictKeyError:
。来源:Django文档:
HTTP请求正文
原始HTTP请求正文作为字节串。这对于以不同于传统HTML表单的方式处理数据很有用:二进制图像、XML有效负载等。要处理常规表单数据,请使用HttpRequest.POST。