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

Django创建用户时authenticate()参数错误及无密码问题求助

解决自定义User模型创建用户时的authenticate报错及无密码问题

核心问题拆解

  • authenticate()调用方式错误:该函数不支持直接传入user对象,必须传入认证凭据(如邮箱、密码)
  • 表单实现逻辑错误:使用普通forms.Form而非ModelForm,导致密码未被哈希存储;同时表单类名与视图引用不匹配

分步修复方案

1. 修复表单类(Forms.py)

把普通表单改成ModelForm,手动处理密码哈希和重复验证,同时修正类名与视图一致:

from django import forms
from .models import User

class RegistrationForm(forms.ModelForm):
    password = forms.CharField(label="Password", widget=forms.PasswordInput(attrs={'class':'form-control'}))
    repeat_password = forms.CharField(label="Repeat Password", widget=forms.PasswordInput(attrs={'class':'form-control'}))

    class Meta:
        model = User
        fields = ['username', 'email', 'first_name', 'last_name', 'phone_number']

    def clean(self):
        cleaned_data = super().clean()
        password = cleaned_data.get("password")
        repeat_password = cleaned_data.get("repeat_password")

        if password != repeat_password:
            self.add_error('repeat_password', "密码输入不一致")
        return cleaned_data

    def save(self, commit=True):
        user = super().save(commit=False)
        user.set_password(self.cleaned_data["password"])  # 对密码进行哈希处理
        if commit:
            user.save()
        return user

说明:

  • 用ModelForm关联自定义User模型,自动处理模型字段的基础验证
  • 单独添加密码和重复密码字段,在clean方法中校验一致性
  • 重写save方法,通过set_password确保密码以哈希形式存储

2. 修复视图中的authenticate调用(Views.py)

修正authenticate传参方式,同时添加用户登录逻辑,还要修复模板路径的引号错误:

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
from .forms import RegistrationForm

def create_user(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            user = form.save()
            # 用表单提交的邮箱和密码进行认证
            auth_user = authenticate(request, email=user.email, password=request.POST['password'])
            if auth_user is not None:
                login(request, auth_user)  # 认证成功后登录用户
            return redirect('Home')
    else:
        form = RegistrationForm()
    return render(request, 'register.html', {'form':form})

说明:

  • authenticate需要传入email(因为自定义User的USERNAME_FIELD是email)和明文密码
  • 认证成功后调用login方法,完成用户登录流程
  • 修复原代码中模板路径的引号缺失问题

3. 修正User模型的REQUIRED_FIELDS(Models.py)

REQUIRED_FIELDS不需要包含password,Django会自动处理密码输入:

class User(AbstractUser): 
    username = models.CharField(max_length=70, unique=True) 
    email = models.EmailField(unique=True) 
    phone_number = models.CharField(max_length=15) 

    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = ['username', 'first_name', 'last_name', 'phone_number']

    def __str__(self): 
        return self.email

验证修复效果

  • 用户创建后,后台查看密码字段会显示哈希值(不再为空)
  • authenticate()调用不再报错,用户创建成功后会自动登录并跳转到首页

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 09:05:32