如何在Django上由管理员和客户分隔用户(模型)

时间:2016-01-12 12:17:23

标签: python django django-models django-admin

我想将我的Django应用程序的用户分为两类:
- 管理员(使用Django管理员的用户) - 继承自AbstractUser
- 用户(客户用户) - 继承自AbstractBaseUser

我想将这两种用户分开,因为AbstractUseris_staffis_superusergroupspermissions)的所有字段对我来说都无用客户用户以及权限和组,我只想实现不同的东西。这就是为什么,我想使用AbstractBaseUser

但是对于django管理员用户AbstractUser类,这是完美的,尤其是权限功能。

class Admin(AbstractUser):
    pass

class Customer(AbstractBaseUser):
    pass

但是现在,有没有办法精确地为django管理员使用Admin的用户模型? 并将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没有permissionsis_superuser和{{1} } fields。

如果将其设置为is_staff,我将无法使用AdminCustomers进行身份验证。

那么你们有解决这个问题的方法吗?

1 个答案:

答案 0 :(得分:5)

Django为您提供的方式似乎更灵活,适应未来。

  1. 您有一个内置的User模型,您可以覆盖它。无论如何,该模型具有权限,组等。
  2. 如果您需要为不同类型的用户设置不同的字段集,则可以创建OneToOne个人资料模型。
  3. 您的管理员(实际上是员工用户)与普通客户之间的分离点是User.is_staff属性。
  4. 通过这种方式,您获得了许多很酷的东西(与两个完全不同的用户模型相比):

    • 一切都开箱即用contrib.authcontrib.admin模块。
    • 易于自定义的分隔点:只需覆盖admin_site.has_permission()即可。
    • 您有能力(但没有义务)创建客户和管理员的用户。
    • 您可以为您的客户分配群组和权限(与您的管理员不同)。即使你现在也不需要它,谁知道。

    至于缺点。到目前为止您唯一指出的一个问题:您的客户将拥有(暂时不使用)权限。好吧,因为他们(以及组)只是单独的表,您的客户数据将没有存储开销的性能。

    也就是说,与收益相比,开销是可以忽略的。我强烈建议保留Django的默认User模型并在必要时进行扩展。