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

