Django自定义注册页报name 'user'未定义及MultiValueDictKeyError错误
错误原因
NameError: name 'user' is not defined:你的校验逻辑(密码比对、空值判断)完全写在POST请求判断分支外,用户首次访问/register路径是GET请求,不会进入创建user实例的代码块,此时调用user属性自然报未定义。- 改为GET请求后的
MultiValueDictKeyError 'fname':你直接用request.POST['key']/request.GET['key']的方式取值,当请求中没有对应参数时会直接抛出键不存在错误,且注册提交本就应该用POST方法,改为GET属于错误的修复方向。 - 额外问题:你用了不必要的global全局变量user,会引发多用户并发访问的逻辑冲突;且repassword是校验用字段,不需要存储到数据库中,明文存储密码也存在严重安全隐患。
修复代码
views.py
from django.shortcuts import render,redirect from .models import User from django.contrib import messages from django.contrib.auth.hashers import make_password # 用于加密密码,可选但推荐 def home(request): return render(request, 'home.html') def register(request): # 只有POST请求才走提交逻辑 if request.method == 'POST': # 用.get()取值,不存在时默认返回空字符串,避免键错误 fname = request.POST.get('fname', '') lname = request.POST.get('lname', '') email = request.POST.get('email', '') password = request.POST.get('password', '') repassword = request.POST.get('repassword', '') # 校验逻辑全放到POST分支内 if password != repassword: messages.info(request, "两次输入的密码不一致") return redirect("register") if fname == "" or password == "" or email == "": messages.info(request, "存在必填字段为空") return redirect("register") # 校验通过再创建用户实例存储 user = User() user.fname = fname user.lname = lname user.email = email # 不要存明文密码,用django自带的加密方法 user.password = make_password(password) user.save() # 注册成功建议跳转到登录页或者首页 return redirect("home") # GET请求直接返回注册页 return render(request, 'register.html')
models.py
from django.db import models class User(models.Model): id = models.AutoField(primary_key=True) fname = models.CharField(max_length=100) lname = models.CharField(max_length=100) email = models.CharField(max_length=50, unique=True) # 建议加unique约束避免重复注册 password = models.CharField(max_length=200) # 加密后密码长度会变长,建议扩容字段 # 删掉repassword字段,不需要存储到数据库
模板代码无需修改,保持method="post"即可
内容的提问来源于stack exchange,提问作者hillary etafo
相关产品推荐
相关产品推荐

