多种类型的用户

时间:2015-09-28 20:04:22

标签: django django-models

我正在编写一个django网络应用程序,用于模拟医院员工和患者可以登录的应用程序。患者,护士和医生都有不同的权限,模型需要存储不同的信息。我目前正在尝试创建一个包含所有公共字段的用户配置文件模型,然后为每种类型的员工创建单独的模型,每个模型都具有oneToOneField(UserProfile)属性。我想知道如何从我的views.py文件中分辨出哪种类型的用户登录。例如,是否可以执行以下操作:

    if request.user.is_patient():
        show patient form
    elif request.user.is_doctor:
        show doctor form

到目前为止,这是我在models.py中的内容:

class BaseUser(models.Model):
    user = models.OneToOneField(User)
    username = models.CharField(max_length=30)
    firstName = models.CharField(max_length=50)
    middleName = models.CharField(max_length=50)
    lastName = models.CharField(max_length=50)
    sex = models.CharField(max_length=10)
    address = models.CharField(max_length=200)
    email = models.CharField(max_length=50)
    phone = models.CharField(max_length=10)

User.profile = property(lambda u: BaseUser.objects.get_or_create(user=u)[0])

class PatientUser(models.Model):
    user = models.OneToOneField(BaseUser)
    existingConditions = models.TextField()
    prescriptions = models.TextField()

1 个答案:

答案 0 :(得分:1)

好了,既然您已经创建了自定义BaseUser模型,那么您可以在该类中设置一组属性来识别它。

这是一个粗略的例子,您可以用它来在视图中测试用户的性质:

class BaseUser(models.Model):
    def is_patient(self):
        try:
            self.patientuser
        except PatientUser.DoesNotExist:
            return False
        else:
            return True

    def is_doctor(self):
        try:
            self.doctoruser
        except DoctorUser.DoesNotExist:
            return False
        else:
            return True

然后,在您看来,您可以简单地:

if request.user.baseuser.is_doctor():
    show doctor form
elif request.user.baseuser.is_patient():
    show patient form

要确保您的用户与基本用户相关联,您可以查看User模型的post-save signal。您可以查看如何为这些信号here注册操作。

以下是一个非常简单的示例:

from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User


@receiver(pre_save, sender=User)
def my_handler(sender, **kwargs): 
    BaseUser.objects.create(user=sender, ...)