我有一个自定义用户模型,其中包含普通用户和管理员通用的字段(电子邮件[用于登录系统]、名字和姓氏)。但我想为系统的普通用户提供额外的字段。我如何实现这一目标?
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
我尝试了上面的代码,但它只为普通用户和管理员创建一个表
您可以在模型上添加 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 是否等于你想要或需要的任何内容,仅此而已。
我尝试了上面的代码,但它只为普通用户和管理员创建一个表。
这是有道理的,它不会创建两个单独的表,它只是添加一列
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
,但我认为这只会让事情变得复杂。
为什么不只保留一张简单的表格,管理员不必(必须)填写额外的数据。这个比较简单。