Django Views.py中引用表单提交后模型id发邮件报KeyError如何解决
问题解决方法
错误原因
KeyError: 'id'报错是因为模型的主键id是数据存入数据库时自动生成的系统字段,不会包含在用户提交的表单清洗数据form.cleaned_data中,直接读取不存在的键就会触发该错误。
正确实现方式
Django的ModelForm调用save()方法时会返回刚创建完成的模型实例,你只需要接住这个返回值,就可以直接获取自动生成的id字段。
修改后的完整代码如下:
def jobCard(request ): form = jobCardForm() if request.method == 'POST': form = jobCardForm(request.POST) if form.is_valid(): # 接收save方法返回的刚保存的模型实例 job_card_instance = form.save() send_mail( f'ZTS JOB CARD {form.cleaned_data["jobNumber"]}', f'A new job card has been loaded for {form.cleaned_data["customerName"]} with a Total Cost of {form.cleaned_data["totalCostOfJob"]} (http://localhost:8000/zipherJobCards/viewJobCard/{job_card_instance.id})', 'it.zipher@gmail.com', ['it@zipher.co.za'], fail_silently=False, ) return redirect('home') else: print(form.errors) content = {'form':form} return render(request, 'main/jobCard.html', content)
可选优化建议
- 不要硬编码URL路径,可使用Django内置的
reverse函数配合request.build_absolute_uri动态生成完整访问链接,后续路由规则调整时不需要手动修改业务代码,示例如下:
from django.urls import reverse # 生成链接部分替换为如下代码 job_card_url = request.build_absolute_uri(reverse('viewJobCard', args=[job_card_instance.id]))
内容的提问来源于stack exchange,提问作者Kyle
相关产品推荐
相关产品推荐

