Django -无法通过直接从admit站点创建的用户登录到管理站点

flvtvl50  于 2023-06-25  发布在  Go
关注(0)|答案(2)|浏览(164)

因此,我使用AbstractUser创建了一个Customer用户模型
Model.py

class Department(models.Model):
    department_name = models.CharField(max_length=20)

    def __str__(self):
        return self.department_name

class Role(models.Model):
    role_name = models.CharField(max_length=120)

    def __str__(self):
        return self.role_name

class Task(models.Model):
    task_desp = models.TextField(max_length=100)
    in_progress = models.BooleanField()
    
    def __str__(self):
        return self.task_desp

class Employee(AbstractUser):
    username = None
    email = models.EmailField(max_length=100,unique=True)
    phone_number = models.CharField(max_length=14)
    department = models.ForeignKey(Department,on_delete=models.CASCADE,null=True,blank=True)
    role = models.ForeignKey(Role,on_delete=models.CASCADE,null=True,blank=True)
    address = models.TextField(max_length=200)
    task_assigned = models.ForeignKey(Task,on_delete=models.CASCADE,null=True,blank=True)

    USERNAME_FIELD= 'email'
    REQUIRED_FIELDS = ['phone_number']

    objects= UserManager()

    def __str__(self):
        return self.email

manager.py

from django.contrib.auth.base_user import BaseUserManager 

class UserManager(BaseUserManager):

    use_in_migrations = True

    def create_user(self,email,password=None,**extra_fields):
        if not email:
            raise ValueError("Please provide email")

        email = self.normalize_email(email)
        user = self.model(email=email,**extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user    

    def create_superuser(self,email,password,**extra_fields):
        extra_fields.setdefault('is_staff',True)
        extra_fields.setdefault('is_superuser',True)
        extra_fields.setdefault('is_active',True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError("super user must have staff user")

        return self.create_user(email,password,**extra_fields)

在设置中添加了模型
AUTH_USER_MODEL = 'emp.Employee'
所以,我做了3用户通过python manage.py createsuperuser,并能够登录到承认网站,但当我做了第4个用户直接从管理网站,给它所有的工作人员和超级用户权限我无法登录
我得到这个错误
请输入员工帐户的正确电子邮件和密码。请注意,这两个字段都可以区分大小写。

我创建这个Elon用户(忽略名称)直接从管理面板,但我无法登录与电子邮件和密码提供,尽管我已经检查了员工和超级用户选项。我认为直接显示的密码可能是问题所在,因为其他3个用户的密码是加密的。

ovfsdjhp

ovfsdjhp1#

ModelAdmin直接保存“password”,而不是hash。你应该自己在ModelAdmin中使用保存_model方法:

@admin.site.register(Employee)
class EmployeeModelAdmin(ModelAdmin):

    ... # your model admin code

    def save_model(self, request, obj, form, change):
        if not change:
            obj.set_password(form.cleaned_data['password'])
        super().model_save(request, obj, form, change)
5fjcxozz

5fjcxozz2#

是真的。当我使用AbstractUser实现自定义用户模型并在管理站点上创建用户时,我也遇到了您提出的问题。我所做的几乎和马克西姆所做的相似。我将此方法添加到自定义用户类中,以覆盖默认的保存方法

def save(self, *args, **kwargs):
    if not self.pk: 
        self.set_password(self.password)
    super().save(*args, **kwargs)

该方法用加密的密码保存新用户。如果你想让它在更新密码时也能工作,你可以去掉' if not self.pk '参数

相关问题