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

问题描述 投票:0回答:1

我想将 Django 应用程序的用户分为两个类:
- Admin(使用 Django admin 的用户) - 继承自

AbstractUser

- User(客户用户)- 继承自
AbstractBaseUser

我想将这两种用户分开,因为

AbstractUser
is_staff
is_superuser
groups
permissions
)的所有字段对于我的客户用户来说都是无用的,对于权限和组来说,我只想实施不同的事情。所以,我想用
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
没有
permissions
is_superuser
is_staff
字段。

如果将其设置为

Admin
,我将无法使用
Customers
验证
django.contrib.auth

那么大家有办法解决这个问题吗?

python django django-models django-admin
1个回答
7
投票

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

  1. 您有一个内置的
    User
    模型,您可以覆盖该模型。无论如何,该模型有权限、组等。
  2. 如果您需要为不同类型的用户设置不同的字段集,您可以创建
    OneToOne
    配置文件模型
  3. 管理员(实际上是员工用户)和普通客户之间的分离点是
    User.is_staff
    属性。

通过这种方式,你可以获得很多很酷的东西(与两个完全不同的用户模型相比):

  • 一切都开箱即用
    contrib.auth
    contrib.admin
    模块。
  • 易于定制的分离点:只需覆盖
    admin_site.has_permission()
    即可。
  • 您有能力(但没有义务)创建“客户和管理员”的用户。 您可以向客户分配
  • 组和权限
  • (与管理员的不同)。即使你现在不需要它,谁知道呢。
  • 至于缺点。到目前为止您所指出的唯一一个:您的客户将拥有(目前未使用)权限。好吧,由于它们(以及组)只是单独的表,因此您的客户数据将不会产生存储开销。

也就是说,与收益相比,开销可以忽略不计。我强烈建议保留 Django 的默认

User

模型,并在必要时扩展它。

    

© www.soinside.com 2019 - 2024. All rights reserved.