我使用抽象用户类来扩展我的用户类.在我的用户类中,目前有3个职位:管理员、讲师和校友.我可以用is_superuseris_staff来解决问题,但是将来可能会出现更多角色,如果我用上面的方法就不可能更好地添加更多角色了.但如果我使用附加字段role = models.IntegerField(choices=Role.choices, default=Role.ALUMNI),它看起来很好.但当使用superuseris_superuser = True时,用户的角色是校友. 顺便说一句,我正在使用django rest_framework进行一个项目.我希望由管理员创建具有讲师角色的用户并设置默认密码,自帐户创建之日起24小时后,如果讲师不更改密码,帐户将被锁定,管理员将不得不为讲师重新开放.我写了两个函数savecheck_password_expiry,但我不确定它是否如我所希望的那样工作. 有人能解决我当前的问题吗?

class User(AbstractUser):

    class Role(models.IntegerChoices):
        ADMIN = 1, "Admin"
        LECTURER = 2, "Lecturer"
        ALUMNI = 3, "Alumni"

    avatar = CloudinaryField(null=True)
    cover = CloudinaryField(null=True)
    role = models.IntegerField(choices=Role.choices, default=Role.ALUMNI)
    alumni = models.OneToOneField(Alumni, on_delete=models.CASCADE, null=True, blank=True)
    friends = models.ManyToManyField('self', symmetrical=True, blank=True)

    def save(self, *args, **kwargs):
        if self.role == User.Role.LECTURER and not self.password: 
            self.set_password('ou@123')
        super().save()

    def check_password_expiry(self):
        if self.role == User.Role.LECTURER:
            if timezone.now() - self.date_joined > timedelta(hours=24):
                self.is_active = False
                self.save()
                
    def __str__(self):
        return f'{self.last_name} {self.first_name}'

推荐答案

role添加到REQUIRED_FIELDS [Django-doc]:

class User(AbstractUser):
    REQUIRED_FIELDS = ['role']
    # …

正如文件所说:

will be prompted for when creating a user via the 100 management command.将提示用户为这些字段中的每个字段提供值的字段名称列表.它必须包括空白为False或未定义的任何字段,并且可能包括您希望在交互式创建用户时提示输入的其他字段.REQUIRED_FIELDS对Django的其他部分没有影响,例如在管理员中创建用户.

Django相关问答推荐

获取PyCharm中继承方法的未解析属性引用

Django:我的上下文变量不能用于重复的for循环

无法在views.py django中验证密码

如何创建复杂的查询?| ChartJS 和 Django

在用例图中建模前端和后端

djangorestframework:过滤相关字段

Django 视图 - 首先从调用应用程序的目录加载模板

如何在 Django 中返回静态 HTML 文件作为响应?

如何迭代模板中 SelectField 的选项?

AngularJS + Django Rest Framework + CORS(CSRF Coo​​kie 没有出现在客户端)

Django JavaScript 文件

如何使用基于类的视图处理表单(通过 get 或 post)?

在 Django 中注册用户的最佳方法

获取 django 应用的绝对路径

Django:以 10 为底的 int() 的无效文字

如何在 django 中仅获取表的特定列?

找不到 msguniq.确保您安装了 GNU gettext 工具 0.15 或更新版本. (Django 1.8 和 OSX ElCapitan)

如何在 django 2.0 admin 中使用 allow_tags?

想要在 Django 测试中禁用信号

Django:在模块中实现 status字段的最佳方式