我对django相对较新,但是很高兴学习这样一个通用的框架。我正在一个项目中,我将有2个用户类型,帐户1和帐户2。帐户2将能够“添加用户”到他们的帐户。将帐户2视为可以将用户添加到其公司的公司。
到目前为止,我已经扩展了通用用户模型并为每种帐户类型创建了一个类,但是我不确定自己是否做得正确。最终,我将要为每种帐户类型创建一个登录/注册表单-类似于ziprecruiter的功能,因此,如果可能的话,一些建议也非常实用。
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(_('email address'), unique=True)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
date_joined = models.DateTimeField(default=timezone.now)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = UserManager()
def __str__(self):
return self.email
class account1(User):
profile = models.ForeignKey(User, on_delete=models.CASCADE, related_name='+', null=True)
# account 2 fields here
first_name = models.TextField(max_length=30, blank=True)
last_name = models.TextField(max_length=30, blank=True)
location = models.TextField(max_length=30, blank=True)
class Meta:
db_table = 'account1_user'
class account2(User):
profile = models.ForeignKey(User, on_delete=models.CASCADE, related_name='+')
# account2 user fields here
class Meta:
db_table = 'account2_user'
我正确执行此操作吗?为每种类型的帐户创建登录/注册表单的最佳方法是什么?创建允许用户类型的用户(如果可行)的模型的最佳方法是什么?
经验法则与您的业务逻辑无关,始终为您的应用程序使用一个用户模型。如果要使用多种类型的用户,则可以使用属性来确定用户类型。例如,在我的应用程序中,我需要三种类型的用户:Admin
,Broker
和Client
。这是我们可以做到的。
class UserManager(BaseUserManager):
def create_client(self, username, first_name, last_name, email, phone, password=None):
user = self.model(
username=username,
first_name=first_name,
last_name=last_name,
phone=phone,
email=self.normalize_email(email)
)
user.set_password(password)
user.is_client = True
user.save(using=self.db)
return user
def create_reseller(self, username, first_name, last_name, email, phone, password=None):
user = self.create_client(username, first_name, last_name, email, phone, password)
user.is_reseller = True
user.save()
return user
def create_admin(self, username, first_name, last_name, email, phone, password=None):
user = self.create_reseller(username, first_name, last_name, email, phone, password)
user.is_admin = True
user.save()
return user
class User(AbstractBaseUser, PermissionsMixin):
is_superuser = None
REQUIRED_FIELDS = ["username", "first_name", "last_name", "phone"]
EMAIL_FIELD = "email"
USERNAME_FIELD = 'email'
objects = UserManager()
email = models.EmailField(unique=True)
username = models.CharField(max_length=DefaultModel.MAX_LENGTH)
first_name = models.CharField(max_length=DefaultModel.MAX_LENGTH)
last_name = models.CharField(max_length=DefaultModel.MAX_LENGTH)
phone = PhoneNumberField(unique=True)
is_admin = models.BooleanField(default=False)
is_reseller = models.BooleanField(default=False)
is_client = models.BooleanField(default=False)
# storing timestamps for users.
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
added_by = models.ForeignKey("self", models.CASCADE, default=None, null=True)
所以,我正在使用自定义的UserManager
类,该类负责生成User
模型对象,并且我已经实现了为所有类型的用户Client
,Broker
和Admin
生成方法。 。
DefaultModel
实际上是类,我正在使用它作为常量来设置模型的默认值。这是它的样子:
class DefaultModel:
MAX_LENGTH = 1000
MYSQL_UNIQUE_LENGTH = 255
如果您不了解模型中的objects
,则可以从Django文档中学习。Custom User ModelsDjango Managers