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
相关产品推荐
相关产品推荐

