Django中views.py的save()方法使用教程及NOT NULL约束失败错误解决方案
Django中save()方法的正确使用与NOT NULL约束错误解决
首先,咱们先拆解你遇到的NOT NULL constraint failed: pages_login.username错误——这个错误很明确:你尝试往数据库的pages_login表中插入一条记录,但username字段的值是空(NULL),而你的模型里username是必填的CharField(默认不允许为NULL),所以数据库拒绝了这次插入操作。
错误的核心原因
你的about视图没有区分请求方法:当用户通过GET请求访问这个页面时(比如直接在地址栏输入URL),request.POST是空的,request.POST.get("username")会返回None,这时候创建Login实例时username就是None,调用save()自然就触发了NOT NULL约束错误。
save()方法的正确打开方式
Django模型的save()方法本身用法很直接——只要模型实例的所有必填字段都有合法值,调用它就能把数据持久化到数据库。但关键是要确保在调用save()前,所有必填字段都被正确赋值,并且处理好不同的请求场景。
修复后的代码示例
修改后的views.py
def about(request): # 只在POST请求时处理表单提交逻辑 if request.method == 'POST': username = request.POST.get("username").strip() # 去除首尾空格 password = request.POST.get("password").strip() # 先验证用户名和密码是否不为空 if username and password: # 创建模型实例并保存 login_record = Login(username=username, password=password) login_record.save() # 可选:保存成功后可以重定向或者添加提示信息 # return redirect('some-success-page') else: # 处理字段为空的情况,比如给模板传错误提示 context = {'error': '用户名和密码不能为空'} return render(request, 'pages/about.html', context) # GET请求直接渲染页面 return render(request, 'pages/about.html')
额外的安全建议(重要!)
你的Login模型现在是明文存储密码,这在生产环境是严重的安全问题。建议使用Django自带的密码哈希功能:
# models.py from django.contrib.auth.hashers import make_password class Login(models.Model): username = models.CharField(max_length=40) password = models.CharField(max_length=128) # 哈希后的密码更长,调整长度 def save(self, *args, **kwargs): # 每次保存时自动哈希密码 self.password = make_password(self.password) super().save(*args, **kwargs)
关键注意事项
- 始终区分请求方法:表单提交用POST,页面渲染用GET,避免GET请求触发数据保存逻辑。
- 对用户输入做基础校验:至少检查必填字段是否为空,避免无效数据进入数据库。
- 敏感数据要加密:密码这类敏感信息绝对不能明文存储,一定要用哈希算法处理。
内容的提问来源于stack exchange,提问作者user17794736
相关产品推荐
相关产品推荐

