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
相关产品推荐
相关产品推荐

