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

Django自定义注册页报name 'user'未定义及MultiValueDictKeyError错误

错误原因

  1. NameError: name 'user' is not defined:你的校验逻辑(密码比对、空值判断)完全写在POST请求判断分支外,用户首次访问/register路径是GET请求,不会进入创建user实例的代码块,此时调用user属性自然报未定义。
  2. 改为GET请求后的MultiValueDictKeyError 'fname':你直接用request.POST['key']/request.GET['key']的方式取值,当请求中没有对应参数时会直接抛出键不存在错误,且注册提交本就应该用POST方法,改为GET属于错误的修复方向。
  3. 额外问题:你用了不必要的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:15:07