Django中使用textarea时触发KeyError错误,求解决方案
解决Django表单提交时KeyError 'body'的问题
核心问题分析
你在调用Contact.objects.create时尝试获取data['body']触发KeyError,说明提交的请求数据里不存在body字段,或者你处理表单数据的方式有误。结合你提供的代码信息,以下是具体原因和修复方案:
可能的原因及修复方法
1. 未通过Django表单类正确处理提交数据
如果你的视图里直接从request.POST取数据,而非先通过ContactForm做验证清洗,可能因为表单验证失败(比如字段不符合规则),或直接调用request.POST时未处理字段缺失的情况,导致找不到body键。
正确处理方式:
# views.py from django.shortcuts import render from .forms import ContactForm from .models import Contact def contact(request): if request.method == 'POST': form = ContactForm(request.POST) if form.is_valid(): cleaned_data = form.cleaned_data # 注意模型字段是text,对应表单的body字段 Contact.objects.create( title=cleaned_data['title'], phone_mail=cleaned_data['phone_mail'], text=cleaned_data['body'] ) return render(request, 'success.html') # 提交成功后的页面 else: form = ContactForm() return render(request, 'contact.html', {'form': form})
2. 前端表单实际未提交body字段
虽然你设置了textarea的name为body,但可能存在以下情况:
- 表单未包裹在
<form>标签内,或表单的method未设为POST - textarea被隐藏/禁用,导致提交时未携带该字段
- 前端JS修改了字段name或阻止了字段提交
检查方法:
打开浏览器开发者工具(F12)→ 网络标签,提交表单后查看POST请求的Form Data,确认是否包含body字段及其值。
3. 表单字段允许为空但未做容错处理
如果ContactForm里的body字段设置了required=False,提交时该字段为空的话,cleaned_data里可能不会生成body键(取决于Django版本)。
修复方式:
用get方法做容错处理:
text=cleaned_data.get('body', '') # 为空时返回空字符串
4. 模型与表单字段对应错误
你的Contact模型字段是text,表单字段是body,创建实例时要确保是将表单的body值赋值给模型的text字段,避免字段名混淆。
内容的提问来源于stack exchange,提问作者Alireza javanpour
相关产品推荐
相关产品推荐

