Django后台创建的用户无法登录问题求助及代码排查
问题原因与解决方法
你推测的完全正确:Admin后台创建用户时密码未被哈希是核心问题。直接将自定义AbstractUser子类注册到Admin时,系统不会启用专门处理密码哈希的表单逻辑,导致输入的密码以明文存储,而登录验证时authenticate()方法会按照哈希规则校验,自然匹配失败。
解决步骤:自定义UserAdmin类
修改admin.py,替换默认的模型注册方式,使用Django内置的UserAdmin基类管理你的自定义User模型,它会自动处理密码哈希逻辑:
from django.contrib import admin from django.contrib.auth.admin import UserAdmin from .models import User, Article, Category class CustomUserAdmin(UserAdmin): # Admin列表页显示的字段 list_display = ('username', 'email', 'date_of_birth', 'is_staff') # 编辑页的字段分组 fieldsets = ( (None, {'fields': ('username', 'password')}), ('个人信息', {'fields': ('email', 'profile_pic', 'date_of_birth')}), ('权限设置', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}), ('关键日期', {'fields': ('last_login', 'date_joined')}), ) # 添加用户时的表单字段(自动包含密码确认与哈希) add_fieldsets = ( (None, { 'classes': ('wide',), 'fields': ('username', 'email', 'password1', 'password2', 'date_of_birth', 'profile_pic'), }), ) # 用自定义的UserAdmin注册User模型 admin.site.register(User, CustomUserAdmin) admin.site.register(Article) admin.site.register(Category)
额外优化建议
- 简化User模型定义:你继承的
AbstractUser已经内置了username、email字段,无需重复定义,可简化models.py:
from django.db import models from django.contrib.auth.models import AbstractUser class User(AbstractUser): profile_pic = models.ImageField(null=True, blank=True, upload_to="images/profile-images") date_of_birth = models.DateField(null=True, blank=True) # 移除重复的username和email定义
- 完善注册表单密码校验:你的
SignUpForm包含password_confirm字段,但当前代码未校验两次密码是否一致,建议添加校验逻辑:
class SignUpForm(forms.Form): # ... 原有字段定义 ... def clean(self): cleaned_data = super().clean() password = cleaned_data.get("password") password_confirm = cleaned_data.get("password_confirm") if password != password_confirm: raise forms.ValidationError("两次输入的密码不一致!") return cleaned_data
验证效果
修改后重启服务,在Admin后台创建用户时会出现password1和password2输入框,系统会自动对密码进行哈希处理,创建的用户可以正常通过登录接口验证。
内容的提问来源于stack exchange,提问作者TitanRush
相关产品推荐
相关产品推荐

