如何在 Django 中为普通用户和管理员用户创建单独的字段?

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

我有一个自定义用户模型,其中包含普通用户和管理员通用的字段(电子邮件[用于登录系统]、名字和姓氏)。但我想为系统的普通用户提供额外的字段。我如何实现这一目标?

class UserAccountManager(BaseUserManager):
    def create_user(self, email, first_name, last_name, password=None):
        if not email:
            raise ValueError('The Email field must be set')
        
        email = self.normalize_email(email)
        email = email.lower()

        user = self.model(
            email=email,
            first_name=first_name,
            last_name=last_name
        )

        user.set_password(password)
        user.save(using=self._db)

        return user    

    def create_superuser(self, email, first_name, last_name, password=None):
        user = self.create_user(email, first_name, last_name, password)

        user.is_superuser = True
        user.is_staff = True

        user.save(using=self._db)

        return user
    
   
class UserAccount(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(max_length=255, unique=True)
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    profile_picture = models.ImageField(default='default.jpg', upload_to='profilePictures', null=True, blank=True)


    objects = UserAccountManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name', 'last_name']

    def __str__(self):
        return self.email + " | " + self.first_name

我尝试了上面的代码,但它只为普通用户和管理员创建一个表

django django-models django-orm
2个回答
0
投票

您可以在模型上添加 user_type 字段。我可以给你举个例子:

USER_TYPE_DATA = (
("admin", "admin"),
("member", "member"),)

class UserAccount(AbstractBaseUser, PermissionsMixin):
    user_type = models.CharField(max_length=20, choices=USER_TYPE_DATA, default="member") #new field here
    email = models.EmailField(max_length=255, unique=True)
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    profile_picture = models.ImageField(default='default.jpg', 


    upload_to='profilePictures', null=True, blank=True)
    objects = UserAccountManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name', 'last_name']

    def __str__(self):
         return self.email + " | " + self.first_name

然后你可以检查 user_type 是否等于你想要或需要的任何内容,仅此而已。


0
投票

我尝试了上面的代码,但它只为普通用户和管理员创建一个表。

这是有道理的,它不会创建两个单独的表,它只是添加一列

is_staff
,对于员工用户为
True
,对于非员工用户为
False

然后,您可以使用

@staff_member_required
装饰器来保护视图:

from django.contrib.admin.views.decorators import staff_member_required


@staff_member_required
def my_view(request):
    # …
    pass

虽然您可以为非管理员用户创建一个单独的表,但我强烈建议这样做:它会使登录系统和注册用户变得复杂。

如果你真的想要一张单独的桌子,你可以制作一个

Profile
模型并让
UserAccount
引用
Profile
,但我认为这只会让事情变得复杂。

为什么不只保留一张简单的表格,管理员不必(必须)填写额外的数据。这个比较简单。

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