Django中create_user方法无法创建用户,登录提示Bad Credentials
Django create_user创建用户失败无报错,登录提示"Bad Credentials"
问题详情
尝试使用create_user方法创建用户,但用户未被创建,登录时始终收到"Bad Credentials"提示,且无任何报错信息。相关代码及日志如下:
views.py代码
from django.contrib.auth.models import User from django.views import View from django.shortcuts import render, redirect from django.contrib import messages class Signup(View): def get(self, request): return render(request, 'myqpp/signup.html') def post(self, request): username=request.POST.get('username') pas = request.POST.get('password') email = request.POST.get("email") user = User.objects.create_user(username, email, pas) user.save() return redirect('/signin/') class Signin(View): def get(self, request): return render(request, 'myapp/signin.html') def post(self, request): username = request.POST.get('username') pas = request.POST.get('password') user = authenticate(username=username, password=pas) if user is not None: login(request, user) print('Success') return redirect('/', context={"user":user}) else: print('Failed') messages.error(request, 'Bad Credentials') return redirect('/signin/')
控制台日志
[21/Aug/2022 15:31:50] "GET /signup/ HTTP/1.1" 200 3907 Failed [21/Aug/2022 15:32:07] "POST /signin/ HTTP/1.1" 302 0 [21/Aug/2022 15:32:07] "GET /signin/ HTTP/1.1" 200 3304
urls.py代码
from django.urls import path from . import views urlpatterns = [ path('', views.MainView.as_view(), name='home'), path('signup/', views.Signup.as_view(), name='signup'), path('signin/', views.Signin.as_view(), name='signin'), path('signout/', views.Signout.as_view(), name='signout'), ]
核心问题分析
- 注册表单未触发POST请求:日志中无
POST /signup/记录,说明注册按钮点击后未向/signup/提交请求,用户创建逻辑完全未执行。 - 模板路径拼写错误:
Signup类的get方法中模板路径写为myqpp/signup.html,与Signin中的myapp/signin.html不一致,存在拼写错误(myqpp应为myapp),可能导致模板加载异常或表单配置错误。 - Signin视图缺少必要导入:使用了
authenticate和login方法但未导入,会引发运行时错误,可能被日志遗漏或掩盖。 - 冗余的
user.save()调用:create_user方法已自动保存用户,额外调用save()无意义,但不影响功能。
修复步骤
1. 修正注册表单提交配置
确保signup.html中的表单正确指向注册接口,且包含CSRF令牌:
<form method="POST" action="{% url 'signup' %}"> {% csrf_token %} <input type="text" name="username" placeholder="用户名" required> <input type="password" name="password" placeholder="密码" required> <input type="email" name="email" placeholder="邮箱"> <button type="submit">注册</button> </form>
method="POST":确保发送POST请求action="{% url 'signup' %}":通过URL名称指向注册接口,避免硬编码路径错误{% csrf_token %}:Django强制要求的CSRF防护,缺少会导致请求被拒绝
2. 修正模板路径拼写
修改Signup类的get方法:
def get(self, request): return render(request, 'myapp/signup.html') # 将myqpp改为myapp
3. 补充Signin视图的导入
在views.py顶部添加:
from django.contrib.auth import authenticate, login
4. 优化用户创建逻辑(可选)
删除冗余的user.save(),因为create_user已自动完成保存:
def post(self, request): username=request.POST.get('username') pas = request.POST.get('password') email = request.POST.get("email") user = User.objects.create_user(username, email, pas) # 移除user.save() messages.success(request, "注册成功,请登录") return redirect('/signin/')
5. 添加调试日志(可选)
在Signup的post方法中添加日志,确认参数是否正常获取:
def post(self, request): import logging logger = logging.getLogger(__name__) username = request.POST.get('username') pas = request.POST.get('password') email = request.POST.get("email") logger.info(f"Signup params: username={username}, email={email}") if not username or not pas: messages.error(request, "用户名和密码不能为空") return redirect('/signup/') try: user = User.objects.create_user(username, email, pas) messages.success(request, "注册成功,请登录") return redirect('/signin/') except Exception as e: logger.error(f"Signup failed: {str(e)}") messages.error(request, f"注册失败:{str(e)}") return redirect('/signup/')
验证方法
- 重启Django服务,访问
/signup/页面提交注册表单 - 查看控制台日志,确认出现
POST /signup/请求记录 - 登录Django admin,检查Users表是否存在新增用户
- 使用注册账号登录,验证是否能成功跳转首页
内容的提问来源于stack exchange,提问作者Hosam Hashem
相关产品推荐
相关产品推荐

