You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 16:06:00