2010-06-23 5 views
10

내 응용 프로그램에서 장고 등록을 사용하고 있습니다. 다른 프로필을 가진 여러 종류의 사용자를 만들고 싶습니다. 예를 들어 한 사용자는 선생이고 다른 사용자는 학생입니다.장고 등록 및 여러 프로필

어떻게하면 user_type을 설정하고 올바른 프로필을 만들 수 있습니까?

+0

을 작동하는 것 같군 거기에 : P – jonasespelita

답변

12

긴 대답 : P 나는 그것이 장고 - 프로파일과 장고 등록 시스템의 다양한 기능을 설명으로 이런 종류의 문제에 대한 The Missing Manual 후 귀중한를 발견했습니다

.

난 당신이

#models.py 
class Profile(models.Model): 
    #add any common fields here (first_name, last_name and email come from User) 

    #perhaps add is_student or is_teacher properites here 
    @property 
    def is_student(self): 
     try: 
      self.student 
      return True 
     except Student.DoesNotExist: 
      return False 

class Teacher(Profile): 
    #teacher fields 

class Student(Profile): 
    #student fields 

장고 등록은 등록를 알리는 신호를 사용하는 예를 들어 AUTH_PROFILE_MODULE

를 통해 설정할 수있는 단일 프로필에 multi table inheritance을 사용하는 것이 좋습니다 것입니다. 이 시점에서 프로파일을 작성해야 user.get_profile()에 대한 호출이 항상 프로파일을 리턴한다고 확신 할 수 있습니다. 사용되는 신호 코드는 당신이 만든 요청에 ​​대한 액세스 권한이 그 신호를 처리 할 때 의미

#registration.signals.py 
user_registered = Signal(providing_args=["user", "request"]) 

입니다. 따라서 POST 할 때 등록 양식에는 작성할 사용자 유형을 식별하는 필드가 있습니다. 당신이 만든 모델에 아무것도를 추가하려면

#signals.py (in your project) 
user_registered.connect(create_profile) 

def create_profile(sender, instance, request, **kwargs): 
    from myapp.models import Profile, Teacher, Student 

    try: 
     user_type = request.POST['usertype'].lower() 
     if user_type == "teacher": #user .lower for case insensitive comparison 
      Teacher(user = instance).save() 
     elif user_type == "student": 
      Student(user = instance).save() 
     else: 
      Profile(user = instance).save() #Default create - might want to raise error instead 
    except KeyError: 
     Profile(user = instance).save() #Default create just a profile 

, 그는 당신은 분명 요청에서 해당 당겨 수 있습니다 등록시, 기본 필드 값이 적용되지 않습니다.

1

http://docs.djangoproject.com/en/1.2/topics/auth/#groups

장고 그룹은 당신이 찾고있는 무엇을 정의 할 수있는 좋은 방법입니다. 교사 및 학생의 모든 속성을 포함하는 하나의 User extended profile을 가질 수 있습니다.

class MasterProfile(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    # add all the fields here 

그런 다음 그룹을 정의 teacherstudent 및 각 MasterProfile 교사 또는 학생 중 하나에 연결합니다.

장고 그룹 테이블은 다양한 역할을 정의하고 그룹에 사용자를 올바르게 할당하는 데 도움을줍니다.

+0

하지만 어떻게 이런 식으로 필드를 구별합니까?선생님들과 학생들이 같은 분야를 갖게 될 것입니다. 맞습니까? 일반적으로 각 사용자 유형마다 다른 필드를 가지려면 여러 프로필 유형이 필요합니다. – Leonardo

1

나는 똑같은 문제가있어서 Chris가 제안한 대답을 시도했지만 나에게 도움이되지 못했습니다.

나는 장고 만 초보자 해요,하지만 난 핸들러 create_profile 취한 인수 신호 user_registered에 의해 providing_args에서 일치한다고 생각하고, 크리스의 대답에 그들은 (나는 그들이 아마 신호 post_save 통과 일치 생각하지 않는다 나는이 누락 매뉴얼에 사용되는 본 적이있는 그는 내가 인수 일치하게 자신의 코드를 수정

)을 인용한다 :

def create_profile(sender, **kwargs): 
    """When user is registered also create a matching profile.""" 

    request, instance = kwargs['request'], kwargs['user'] 

    # parse request form to see whether profile is student or teacher 
    try: 
     user_type = request.POST['usertype'].lower() 
     print(user_type) 
     if user_type == "teacher": #user .lower for case insensitive comparison 
      Teacher(user = instance).save() 
     elif user_type == "student": 
      Student(user = instance).save() 
     else: 
      Userprofile(user = instance).save() #Default create - might want to raise error instead 
    except KeyError: 
     Userprofile(user = instance).save() #Default create just a profile 

그리고 당신이 일반이 지금

관련 문제