当我尝试使用管理界面为用户创建密码时,密码不会被散列。 所以我在用户模型中添加了这一行
def save(self, *args, **kwargs):
self.set_password(self.password)
虽然这解决了问题。 使用
createsuperuser
创建用户时,它将密码保存为哈希值,但是当我尝试登录管理界面时,却显示密码不正确。
我确信这是由于将上面的行添加到代码中引起的。
当我删除该行时,createsuperuser 工作正常,但密码未在管理界面中进行哈希处理,当我添加行时,admin 可以工作,而 createsuperuser 则不能。
如果密码尚未散列,我想对其进行散列。
class CustomUser(AbstractUser):
role = models.ForeignKey(to=Role, to_field='role', on_delete=models.CASCADE, null=True, blank=True)
username = models.CharField(max_length=100, unique=True, editable=True, validators=[MinLengthValidator(5)], null=False)
image = models.ImageField(upload_to='profile_pics/', blank=True)
password = models.CharField(max_length=128)
complaint = GenericRelation(Complaint)
# Specify unique related names for the groups and user_permissions fields
groups = models.ManyToManyField(
Group,
verbose_name=_('groups'),
blank=True,
help_text=_(
'The groups this user belongs to. A user will get all permissions '
'granted to each of their groups.'
),
related_name='custom_users', # Change the related name to 'custom_users'
)
user_permissions = models.ManyToManyField(
Permission,
verbose_name=_('user permissions'),
blank=True,
help_text=_('Specific permissions for this user.'),
related_name='custom_users', # Change the related name to 'custom_users'
)
def __str__(self):
return f'{self.username}'
def save(self, *args, **kwargs):
if self.role_id == 'admin':
self.is_staff = True
if self.image:
img = Image.open(self.image.path)
if img.height > 300 or img.width > 300:
output_size = (300, 300)
img.thumbnail(output_size)
img.save(self.image.path)
super().save(*args, **kwargs)
@admin.register(CustomUser)
class CustomUserAdmin(admin.ModelAdmin):
list_display = ('username', 'password', 'image', 'role')
不要在
.save(…)
方法中进行哈希处理:每次您再次保存模型对象时,都会对密码进行哈希处理。由于 createsuperuser
已经对密码进行了哈希处理,因此它会再次对密码进行哈希处理,使其对(第一个)密码毫无用处。需要使用第一个密码的哈希值登录。
Django
User
的默认管理方式的工作方式是插入一个对其进行哈希处理的表单。我们也可以将其插入自定义管理员:
from django.contrib.auth.forms import UserChangeForm, UserCreationForm
class CustomUserCreationForm(UserCreationForm):
class Meta:
model = CustomUser
fields = ('username', 'role', 'image')
class CustomUserChangeForm(UserChangeForm):
class Meta:
model = CustomUser
fields = ('username', 'role', 'image')
@admin.register(CustomUser)
class CustomUserAdmin(admin.ModelAdmin):
list_display = ('username', 'password', 'image', 'role')
form = CustomUserChangeForm
add_form = CustomUserCreationForm
这还将确保密码显示为
<input type="password'>
,从而将密码隐藏在屏幕上。