2015-09-28 5 views
1

Я пишу веб-приложение 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

Ну, так как вы создали модель пользовательского 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 

Для обеспечения что ваши пользователи имеют связанный с базойзером, вы можете взглянуть на модель post-save signal для модели User. Вы можете проверить, как регистрировать действия для этих сигналов 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, ...) 
+0

Спасибо, я постараюсь это. – Stalfurion

+0

Я пробовал использовать ваше предложение, но у меня есть исключение, у пользователя нет никакого базового пользователя> любая идея, почему это так? – Stalfurion

+0

Имеет ли ваше использование связанный с базойзером экземпляр? – Alvaro

Смежные вопросы