Django对接MySQL时表单提交数据无法存入数据库该如何解决?
需要修复的问题及对应修改方案
1. 前端表单核心问题
- 表单标签缺失
POST提交方式,默认以GET方式提交,永远不会进入后端的POST逻辑分支 - 输入框的
name属性和模型表单的字段名不匹配,Django ModelForm会严格按字段名匹配请求参数,名称不一致会导致参数无法被接收,表单验证直接失败 - 日期输入为文本类型,容易出现格式不符合
DateField要求的问题,导致验证不通过
修复后的前端代码片段:
<!-- 新增method="post"指定提交方式,可按需补充action属性指向对应路由 --> <form method="post" class="space-y-8 divide-y divide-gray-200 m-2"> {% csrf_token %} <div class="space-y-8 divide-y divide-gray-200"> <div class="pt-8"> <div> <h3 class="text-lg leading-6 font-medium text-gray-900"> Project Information </h3> </div> <div class="mt-6 grid grid-cols-1 gap-y-6 gap-x-4 sm:grid-cols-6"> <div class="sm:col-span-3"> <label for="project-name" class="block text-sm font-medium text-gray-700"> Project Name </label> <div class="mt-1"> <!-- 修改name为和表单字段一致的project_name --> <input type="text" name="project_name" id="project-name" class="shadow-sm focus:ring-gray-500 focus:border-gray-500 block w-full sm:text-sm border-gray-300 rounded-md"> </div> </div> <div class="sm:col-span-3"> <label for="project-location" class="block text-sm font-medium text-gray-700"> Project Location </label> <div class="mt-1"> <!-- 修改name为和表单字段一致的project_location --> <input type="text" name="project_location" id="project-location" class="shadow-sm focus:ring-gray-500 focus:border-gray-500 block w-full sm:text-sm border-gray-300 rounded-md"> </div> </div> </div> <div class="mt-6 grid grid-cols-1 gap-y-6 gap-x-4 sm:grid-cols-6"> <div class="sm:col-span-3"> <label for="project-operator" class="block text-sm font-medium text-gray-700"> Operator </label> <div class="mt-1"> <!-- 修改name为和表单字段一致的operator --> <input type="text" name="operator" id="project-operator" class="shadow-sm focus:ring-gray-500 focus:border-gray-500 block w-full sm:text-sm border-gray-300 rounded-md"> </div> </div> <div class="sm:col-span-3"> <label for="project-start-date" class="block text-sm font-medium text-gray-700"> Start Date </label> <div class="mt-1"> <!-- 修改name为和表单字段一致的date_started,修改type为date保证格式合法 --> <input type="date" name="date_started" id="project-start-date" class="shadow-sm focus:ring-gray-500 focus:border-gray-500 block w-full sm:text-sm border-gray-300 rounded-md"> </div> </div> </div> </div> <div class="pt-5"> <div class="flex justify-end"> <button type="submit" class="ml-3 inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-gray-600 hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-gray-500"> Save </button> </div> </div> </div> </form>
2. 视图逻辑问题
- 没有添加表单验证失败的错误输出,无法感知
form.is_valid()返回False的具体原因 Project.objects.all是方法引用,没有加括号执行实际查询- 提交成功后直接渲染页面容易出现重复提交问题,建议改用重定向
修复后的views.py代码:
from django.shortcuts import redirect def project(request): if request.method == 'POST': form = ProjectForm(request.POST) if form.is_valid(): form.save() # 替换引号内的内容为你项目中对应路由的name值 return redirect('project') else: # 开发环境打印错误排查问题,生产环境可将错误信息传到前端展示 print(form.errors) # 加括号执行查询方法获取数据 all_items = Project.objects.all() return render(request, 'project.html', {'all_items': all_items})
内容的提问来源于stack exchange,提问作者LoudEye
相关产品推荐
相关产品推荐

