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

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'),
]

核心问题分析

  1. 注册表单未触发POST请求:日志中无POST /signup/记录,说明注册按钮点击后未向/signup/提交请求,用户创建逻辑完全未执行。
  2. 模板路径拼写错误:Signup类的get方法中模板路径写为myqpp/signup.html,与Signin中的myapp/signin.html不一致,存在拼写错误(myqpp应为myapp),可能导致模板加载异常或表单配置错误。
  3. Signin视图缺少必要导入:使用了authenticate和login方法但未导入,会引发运行时错误,可能被日志遗漏或掩盖。
  4. 冗余的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/')

验证方法

  1. 重启Django服务,访问/signup/页面提交注册表单
  2. 查看控制台日志,确认出现POST /signup/请求记录
  3. 登录Django admin,检查Users表是否存在新增用户
  4. 使用注册账号登录,验证是否能成功跳转首页

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 10:06:26