如何解决Django页面刷新自动存入id为none、值全为null的虚拟数据错误
Django表单刷新页面自动插入空数据解决方案
问题根因
该问题的核心是视图函数未区分GET和POST请求类型,访问表单页面的GET请求被误触发了入库逻辑,刷新页面默认发送GET请求,无表单提交数据因此生成全空字段的无效数据。
修复步骤
- 第一步:视图层区分请求类型,仅POST请求处理入库逻辑
错误的视图写法通常直接全局处理表单提交,无请求类型判断,修正后的示例代码如下:from django.shortcuts import render, redirect from .forms import MyForm def data_entry_view(request): # 仅POST请求触发表单校验和入库 if request.method == "POST": form = MyForm(request.POST) if form.is_valid(): form.save() # 提交成功后重定向,避免刷新重复提交 return redirect("data_entry_success") # GET请求仅返回空表单 else: form = MyForm() return render(request, "data_entry_form.html", {"form": form}) - 第二步:强制使用PRG(Post/Redirect/Get)模式
表单提交成功后不要直接返回页面渲染,必须返回重定向响应。浏览器接收到重定向后会自动用GET方式访问目标地址,此时用户刷新页面只会重复无副作用的GET请求,不会再次触发表单提交。 - 第三步:模型层增加非空校验兜底
给所有必填字段配置blank=False、null=False属性,从数据层拦截空数据入库,即使上层逻辑出现疏漏也不会生成无效空对象,示例代码如下:from django.db import models class DataRecord(models.Model): # 示例字段,根据你的业务调整 item_name = models.CharField(max_length=200, blank=False, null=False, verbose_name="项目名称") item_value = models.IntegerField(blank=False, null=False, verbose_name="项目数值") create_time = models.DateTimeField(auto_now_add=True)
内容的提问来源于stack exchange,提问作者Kronox
相关产品推荐
相关产品推荐

