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

Django表单提交无报错但未保存至数据库,请求排查问题

问题分析与修复方案

你的代码存在以下几个关键问题,导致表单提交后数据无法保存:

1. 请求方法判断逻辑错误

视图中if "reg" in request.method == 'POST'的写法完全错误,这个表达式会先计算"reg" in request.method(结果为False,因为request.method是'POST',不包含"reg"字符串),再和'POST'比较,最终条件永远不成立。因此POST请求永远不会进入处理分支,直接走else初始化空表单,自然不会保存数据。

修复代码:

def my_create_view(request):
    # 先判断是否是POST请求,再检查是否包含reg提交参数
    if request.method == 'POST' and 'reg' in request.POST:
        first_form = FirstRegForm(request.POST, prefix='firstform')
        second_form = SecondRegForm(request.POST, prefix='secondform')
        if all([first_form.is_valid(), second_form.is_valid()]):
            form = first_form.save(commit=False)
            form.created_name = request.user.user_name
            form.save()
            formm = second_form.save(commit=False)
            formm.shop_seq = form
            formm.save()
            return redirect('someview')
    else:
        # GET请求时的前缀要和POST时一致,否则表单字段不匹配
        first_form = FirstRegForm(prefix='firstform')
        second_form = SecondRegForm(prefix='secondform')
    return render(request, 'app/template.html', {'first_form': first_form, 'second_form': second_form})

2. 表单前缀前后不一致

视图中POST处理时给表单设置的前缀是'firstform'和'secondform',但GET初始化表单时用的是'store'和'input',这会导致模板渲染的表单字段name属性和POST提交的字段名不匹配,表单无法正确读取提交的数据,验证必然失败,进而不会执行保存逻辑。

修复方式:确保GET和POST场景下的表单前缀完全一致(如上一段代码所示)。

3. My_shop模型save方法引用了不存在的Rate模型

在My_shop的save方法中,你错误地使用了Rate.objects.aggregate(...),但代码中并没有定义Rate模型,应该替换为My_shop自身的模型查询,否则当走到保存逻辑时会抛出模型不存在的错误。

修复代码:

class My_shop(models.Model):
    shop_seq = models.CharField(primary_key=True, editable=False, max_length=5)
    shop_name = models.CharField(max_length=20, null=True)
    shop_code = models.CharField(max_length=15, null=True, unique=True)
    shop_address = models.CharField(max_length=40, null=True)
    shop_tel = models.CharField(max_length=20, null=True)
    created_name = models.CharField(max_length=100, null=True)

    def save(self, **kwargs):
        if not self.shop_seq:
            # 改为查询My_shop模型的最大shop_seq
            max_seq = My_shop.objects.aggregate(shop_seq_max=Max('shop_seq'))['shop_seq_max']
            # 处理max_seq为None的情况(表为空时)
            next_seq = max_seq + 1 if max_seq is not None else 1
            self.shop_seq = "{:05d}".format(next_seq)
        super().save(*kwargs)

4. 模板未渲染表单错误信息

当前模板只渲染了表单字段,没有显示验证错误,导致表单验证失败时你无法看到具体原因,不利于调试。建议在每个字段后添加错误提示:

修复后的模板代码:

<form method="post">{% csrf_token %}
  {{ first_form.shop_name }}
  {{ first_form.shop_name.errors }}
  
  {{ first_form.shop_code }}
  {{ first_form.shop_code.errors }}
  
  {{ first_form.shop_address }}
  {{ first_form.shop_address.errors }}
  
  {{ first_form.shop_tel }}
  {{ first_form.shop_tel.errors }}
  
  {{ second_form.my_field }}
  {{ second_form.my_field.errors }}
  
  {{ second_form.some_field }}
  {{ second_form.some_field.errors }}
  
  <input class="btn btn-dark" name="reg" type="submit" value="reg">
</form>

按照以上修复步骤调整代码后,表单提交逻辑就能正常执行,数据也会正确保存到数据库中。

内容的提问来源于stack exchange,提问作者zenia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:54:26