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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:52:18