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

Django注册登录异常:提交注册后Admin面板无新用户

Django注册登录功能异常排查与修复

问题现象

在registration.html页面填写注册信息并提交后,终端打印GET请求日志,Admin面板无新用户创建;登录功能也无法正常工作。

核心错误点

1. 注册表单(registration.html)的致命问题

  • 嵌套<form>标签:外层无method属性的表单覆盖内层表单提交行为,默认以GET方式提交数据
  • 输入框name属性统一错误:邮箱、密码、确认密码的name都写成username,后端无法正确获取对应字段值
  • 表单action路径错误:指向/signup但URL配置中注册路径为/registration/
  • 提交按钮type拼写错误:sumbit应为submit

2. 注册视图(views.py)的错误

  • 变量拼写错误:emnail应为email,会触发未定义变量异常
  • 缺少密码一致性校验:未检查password1和password2是否匹配
  • 无异常捕获逻辑:创建用户过程中出现错误时无提示处理

3. 登录表单(signin.html)的问题

  • 输入框无name属性:后端request.POST无法获取用户名和密码
  • 未指定表单提交方式:默认GET提交,且缺少{% csrf_token %}
  • 注册链接硬编码:href="registration.html"应使用Django URL反向解析

修复后的代码

修复后的registration.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="{% static 'emnosys/css/styles-registration.css' %}">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Registration</title>
</head>
<body>
    <div class="login">
        <h3>Registration</h3>
        <form action="{% url 'registration' %}" method="post">
            {% csrf_token %}
            <label for="username">Username</label>
            <input type="text" id="username" name="username" placeholder="write username" required>
            <br>
            <label for="email">Email</label>
            <input type="email" id="email" name="email" placeholder="write email" required>
            <br>
            <label for="password1">Password</label>
            <input type="password" id="password1" name="password1" placeholder="write password" required>
            <br>
            <label for="password2">Confirm your password</label>
            <input type="password" id="password2" name="password2" placeholder="confirm your password" required>
            <br>
            <button type="submit">Sign Up</button>
        </form>
    </div>
    <div class="waves">
        <img src="{% static 'emnosys/images/waves.png' %}" alt="waves">
    </div>
</body>
</html>

修复后的views.py(Registration函数)

def Registration(request):
    if request.method == "POST":
        username = request.POST.get('username')
        email = request.POST.get('email')
        password1 = request.POST.get('password1')
        password2 = request.POST.get('password2')

        # 校验密码一致性
        if password1 != password2:
            return render(request, "emnosys/registration.html", {'error': 'Passwords do not match'})
        
        # 校验用户名是否已存在
        if User.objects.filter(username=username).exists():
            return render(request, "emnosys/registration.html", {'error': 'Username already taken'})

        try:
            myuser = User.objects.create_user(username, email, password1)
            myuser.save()
            return redirect('signin')
        except Exception as e:
            return render(request, "emnosys/registration.html", {'error': str(e)})
    return render(request, "emnosys/registration.html")

修复后的signin.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="{% static 'emnosys/css/styles-login.css' %}">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Login</title>
</head>
<body>
    <div class="login">
        <h3>Login</h3>
        <form action="{% url 'signin' %}" method="post">
            {% csrf_token %}
            <div class="username">
                <input type="text" id="login" name="username" placeholder=" " autocomplete="off" required>
                <label for="login" id="label1">Username</label>
            </div>
            
            <div class="password">
                <input type="password" id="password" name="pass1" placeholder=" " autocomplete="off" required>
                <label for="password" id="label2">Password</label>
            </div>
            
            <div class="foot">
                <input type="checkbox" name="remember-me" id="remember-me">
                <label for="remember-me">Remember me</label>
                <a href="{% url 'registration' %}" id="register-link">Registration</a>
            </div>
            <div class="submit">
                <button type="submit" id="submit--button">Submit</button>
            </div>
        </form>
    </div>
    <div class="waves">
        <img src="{% static 'emnosys/images/waves.png' %}" alt="waves">
    </div>
</body>
</html>

额外优化建议

  • 使用Django的messages框架展示错误提示,提升用户体验
  • 注册时增加邮箱格式后端校验
  • 登录视图添加错误提示,告知用户用户名或密码错误
  • 生产环境关闭DEBUG模式,避免暴露敏感错误信息

内容的提问来源于stack exchange,提问作者Yuki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 03:19:51