【发布时间】:2016-01-12 12:17:23
【问题描述】:
我想将我的 Django 应用程序的用户分为两个类:
- Admin(使用 Django admin 的用户)- 继承自 AbstractUser
- 用户(客户用户)- 继承自 AbstractBaseUser
我想将这两种用户分开,因为AbstractUser(is_staff、is_superuser、groups、permissions)的所有字段对我的客户用户和权限和组都没用,我只是想要实现一些不同的东西。这就是为什么,我想使用AbstractBaseUser。
但是对于 django 管理员用户,AbstractUser 类,它只是完美的,特别是具有权限功能。
class Admin(AbstractUser):
pass
class Customer(AbstractBaseUser):
pass
但是现在,有没有办法精确使用 Admin 的用户模型仅用于 django 管理员?
并将Customer 模型用于我的其余应用程序。
我必须从头开始实现吗:
class MyUser(AbstractBaseUser):
username = models.CharField(max_length=30, unique=True)
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
email = models.EmailField()
is_active = models.BooleanField(default=False)
class Admin(MyUser, PermissionsMixin):
is_staff = models.BooleanField(default=True)
class Customer(MyUser):
# specific fields
pass
通过这个实现,如果我将AUTH_USER_MODEL 设置为User,权限将不起作用,因为User 没有permissions、is_superuser 和is_staff 字段。
如果将其设置为Admin,我将无法使用django.contrib.auth 验证Customers。
那么各位大侠有解决这个问题的办法吗?
【问题讨论】:
-
拥有两个独立的模型肯定会破坏
contrib.auth或contrib.admin,无论您的request.user是否包含User或Admin。是否有任何客观原因反对让一个基本User模型具有两个“配置文件”OneToOne字段?如果某些字段对您的某些用户组无用,请不要使用它们,毕竟您没有义务这样做。或者您担心性能问题? -
TY 回复人。正如我所说:“我想将这两种用户分开,因为
AbstractUser(is_staff、is_superuser、groups、permissions)的所有字段对我的客户用户以及权限和组都没有用,我只是想实现一些不同的东西。所以,我想使用AbstractBaseUser。”如果客户有两种权限和组,那将是一团糟。我对 Django 很陌生,也许我错了,这是不可能的。我只想要一些高效和干净的东西。 -
嗯,关键是您的用户不必拥有两组权限。唯一的权限“容器”在
User模型中。如果您的用户是管理员,则他设置了is_staff并分配了适当的权限。如果他是客户,那么is_staff是False并且他的权限只是不同(您可以并且可能会想要为不同类型的客户设置一些权限),或者可能为空。例如,这使您能够使客户成为管理员,反之亦然。抱歉,cmets 有长度限制,也许我应该整理一个答案:)。 -
如果您找到了解决方案,可以在这里分享一下吗?
标签: python django django-models django-admin