Django用户注册数据无法存入数据库问题排查求助
Django注册无报错但数据不入库的排查修复
你的代码里存在几个关键问题,直接导致数据无法存入数据库,逐个排查修复:
表单未绑定POST数据
处理POST请求时,你没有把request.POST传递给表单实例,导致form.is_valid()永远返回False,后续的入库代码根本不会执行。
修复:在POST分支内初始化表单时传入请求数据:def test2(request): if request.method=='POST': form = just(request.POST) # 绑定POST数据 if form.is_valid(): # 后续入库逻辑 else: form = just() # GET请求时初始化空表单 context={"form":form} return render(request, "just.html", context)模型查询拼写错误
User.ojects.create里的ojects少了一个字母b,正确写法是User.objects.create。不过因为前面的form.is_valid()没通过,这行代码没执行,所以没触发报错。密码处理逻辑错误
random.random()不接受范围参数,它只能生成0到1之间的浮点数,要生成指定范围的随机数应该用random.randint()。- Django用户密码必须加密存储,直接存字符串会导致用户无法登录,需要用
make_password工具函数加密。
修复示例:
from django.contrib.auth.hashers import make_password import random # ... raw_password = str(random.randint(100000000000, 999999999999)) user21 = User.objects.create( username=form.cleaned_data["Name"], password=make_password(raw_password) )表单数据获取不规范
应该使用form.cleaned_data来获取验证后的表单数据,而不是form.data。cleaned_data是经过Django验证和清洗后的安全数据,避免原始数据的格式问题。外键字段大小写不匹配
模型justforfun中的外键字段是User(大写U),但创建实例时你用了user=user21(小写u)。虽然Django ORM会自动处理这种大小写差异,但为了代码一致性,建议改成User=user21。
修复后的完整视图代码:
from django.contrib.auth.hashers import make_password import random from django.shortcuts import render from .forms import just from .models import User, justforfun def test2(request): if request.method=='POST': form = just(request.POST) if form.is_valid(): raw_password = str(random.randint(100000000000, 999999999999)) user21 = User.objects.create( username=form.cleaned_data["Name"], password=make_password(raw_password) ) # create方法已自动保存,无需额外调用save() just_data = justforfun.objects.create( User=user21, Name=form.cleaned_data["Name"], Roll_no=form.cleaned_data["Roll_no"] ) else: form = just() context = {"form": form} return render(request, "just.html", context)
额外补充:
- 自定义User模型后,必须在
settings.py中配置AUTH_USER_MODEL = '你的应用名.User',否则Django会使用默认用户模型,可能导致数据存储异常。 create()方法会自动将实例保存到数据库,无需额外调用save(),可以去掉冗余的user21.save()和just_data.save()。
内容的提问来源于stack exchange,提问作者Harshith Kumara Kannan
相关产品推荐
相关产品推荐

