使用 Django 自定义用户模型成功创建超级用户后无法登录 Django 管理面板
Can't login to Django admin panel after successfully creating superuser using Django custom user model
我在命令行中创建超级用户后,它说超级用户创建成功,但是当我尝试登录时它说“请输入员工帐户的正确电子邮件地址和密码。请注意,这两个字段可能是区分大小写。”我尝试删除所有迁移和数据库并重试,但没有帮助。
这是我的model.py
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
from django.db.models.deletion import CASCADE
from django.utils import timezone
from django.utils.translation import gettext_lazy
# Create your models here.
class UserAccountManager(BaseUserManager):
def create_user(self, Email, Password = None, **other_fields):
if not Email:
raise ValueError(gettext_lazy('You must provide email address'))
email = self.normalize_email(Email)
user = self.model(Email=email , **other_fields)
user.set_password(Password)
user.save(using=self._db)
return user
def create_superuser(self, Email, Password = None, **other_fields):
other_fields.setdefault('is_staff', True)
other_fields.setdefault('is_superuser', True)
other_fields.setdefault('is_active', True)
return self.create_user(Email=Email, Password = Password, **other_fields)
class Customer(AbstractBaseUser, PermissionsMixin):
Email = models.EmailField(gettext_lazy('email address'), max_length=256, unique=True)
Name = models.CharField(max_length=64, null=True)
Surname = models.CharField(max_length=64, null=True)
Birthday = models.DateField(auto_now=False, null=True,blank=True)
PhoneNumber = models.CharField(max_length=16, unique=True, null=True, blank=True)
Address = models.CharField(max_length=128, blank=True)
RegistrationDate = models.DateTimeField(default=timezone.now, editable=False)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_superuser = models.BooleanField(default=False)
objects = UserAccountManager()
USERNAME_FIELD = 'Email'
REQUIRED_FIELDS = []
def __str__(self):
return self.Name + " " + self.Surname
def has_perm(self, perm, obj = None):
return self.is_superuser
这是我的admin.py
from django import forms
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.forms import ReadOnlyPasswordHashField
from django.core.exceptions import ValidationError
from .models import *
# Register your models here.
class UserCreationForm(forms.ModelForm):
password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)
class Meta:
model = Customer
fields = ('Email', 'Name', 'Surname')
def clean_password2(self):
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
raise ValidationError("Passwords don't match")
return password2
def save(self, commit=True):
# Save the provided password in hashed format
user = super().save(commit=False)
user.set_password(self.cleaned_data["password1"])
if commit:
user.save()
return user
class UserChangeForm(forms.ModelForm):
password = ReadOnlyPasswordHashField()
class Meta:
model = Customer
fields = ('Email', 'Name','Surname','Birthday','PhoneNumber','Address', 'is_staff', 'is_active', 'is_superuser')
def clean_password(self):
return self.initial["password"]
class UserAdmin(BaseUserAdmin):
form = UserChangeForm
add_form = UserCreationForm
list_display = ('Email', 'Name', 'Surname')
list_filter = ('is_superuser','Email', 'Name', 'Birthday')
fieldsets = (
(None, {'fields': ('Email', 'password')}),
('Personal info', {'fields': ('Birthday','Name','Surname')}),
('Permissions', {'fields': ('is_superuser',)}),
)
add_fieldsets = ()
search_fields = ('Email',)
ordering = ('Email',)
filter_horizontal = ()
admin.site.register(Customer,UserAdmin)
在:
def create_user(self, Email, Password = None, **other_fields):
删除 = None,仅保留密码。
并添加password=密码如下:
user = self.model(email=self.normalize_email(
email), username=username, password=password)
user = self.create_user(email=self.normalize_email(
email), username=username, password=password)
希望它能修复它。如果您仍然无法登录,运行 python manage.py 创建超级用户并创建一个新的超级用户并尝试使用该超级用户登录。
我在命令行中创建超级用户后,它说超级用户创建成功,但是当我尝试登录时它说“请输入员工帐户的正确电子邮件地址和密码。请注意,这两个字段可能是区分大小写。”我尝试删除所有迁移和数据库并重试,但没有帮助。
这是我的model.py
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
from django.db.models.deletion import CASCADE
from django.utils import timezone
from django.utils.translation import gettext_lazy
# Create your models here.
class UserAccountManager(BaseUserManager):
def create_user(self, Email, Password = None, **other_fields):
if not Email:
raise ValueError(gettext_lazy('You must provide email address'))
email = self.normalize_email(Email)
user = self.model(Email=email , **other_fields)
user.set_password(Password)
user.save(using=self._db)
return user
def create_superuser(self, Email, Password = None, **other_fields):
other_fields.setdefault('is_staff', True)
other_fields.setdefault('is_superuser', True)
other_fields.setdefault('is_active', True)
return self.create_user(Email=Email, Password = Password, **other_fields)
class Customer(AbstractBaseUser, PermissionsMixin):
Email = models.EmailField(gettext_lazy('email address'), max_length=256, unique=True)
Name = models.CharField(max_length=64, null=True)
Surname = models.CharField(max_length=64, null=True)
Birthday = models.DateField(auto_now=False, null=True,blank=True)
PhoneNumber = models.CharField(max_length=16, unique=True, null=True, blank=True)
Address = models.CharField(max_length=128, blank=True)
RegistrationDate = models.DateTimeField(default=timezone.now, editable=False)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_superuser = models.BooleanField(default=False)
objects = UserAccountManager()
USERNAME_FIELD = 'Email'
REQUIRED_FIELDS = []
def __str__(self):
return self.Name + " " + self.Surname
def has_perm(self, perm, obj = None):
return self.is_superuser
这是我的admin.py
from django import forms
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.forms import ReadOnlyPasswordHashField
from django.core.exceptions import ValidationError
from .models import *
# Register your models here.
class UserCreationForm(forms.ModelForm):
password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)
class Meta:
model = Customer
fields = ('Email', 'Name', 'Surname')
def clean_password2(self):
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
raise ValidationError("Passwords don't match")
return password2
def save(self, commit=True):
# Save the provided password in hashed format
user = super().save(commit=False)
user.set_password(self.cleaned_data["password1"])
if commit:
user.save()
return user
class UserChangeForm(forms.ModelForm):
password = ReadOnlyPasswordHashField()
class Meta:
model = Customer
fields = ('Email', 'Name','Surname','Birthday','PhoneNumber','Address', 'is_staff', 'is_active', 'is_superuser')
def clean_password(self):
return self.initial["password"]
class UserAdmin(BaseUserAdmin):
form = UserChangeForm
add_form = UserCreationForm
list_display = ('Email', 'Name', 'Surname')
list_filter = ('is_superuser','Email', 'Name', 'Birthday')
fieldsets = (
(None, {'fields': ('Email', 'password')}),
('Personal info', {'fields': ('Birthday','Name','Surname')}),
('Permissions', {'fields': ('is_superuser',)}),
)
add_fieldsets = ()
search_fields = ('Email',)
ordering = ('Email',)
filter_horizontal = ()
admin.site.register(Customer,UserAdmin)
在:
def create_user(self, Email, Password = None, **other_fields):
删除 = None,仅保留密码。
并添加password=密码如下:
user = self.model(email=self.normalize_email(
email), username=username, password=password)
user = self.create_user(email=self.normalize_email(
email), username=username, password=password)
希望它能修复它。如果您仍然无法登录,运行 python manage.py 创建超级用户并创建一个新的超级用户并尝试使用该超级用户登录。