2013-06-21 6 views
1

하나의 이해 문제가 있습니다.django 사용자 모델 - 언제 필요할 수 있습니까?

많은 특성을 가진 내 페이지에 대한 사용자 프로필을 만들고 싶습니다. 하지만 장고 auth의 사용자 모델을 처음 접했을 때, 나는 내가 사용자 프로파일을 위해 설정할 새로운 속성으로 그 모델을 확장 할 수 있는지 모른다. 예 : 주소, 나이 ...

사용자 모델이있는 이유는 무엇입니까? 그것은 인증 용도로만 사용됩니까? 이 두 가지 User 모델을 어떻게 처리하고 차별화합니까?

샘플 케이스 :
사용자가 로그인하려고하는데, auth의 사용자 모델로 권한을 확인하고 장고의 사용자 모델과 내 관계를 설정합니까? 그냥 혼란 스러울뿐입니다.

답변

2

나는 사전 장고 1.5

장고의 인증 모델은 원활하게 작동 당신을 위해 로그인과 같은 "편리한"방법, 로그 아웃, 암호 재설정 등의 세트를 제공의 관점에서 설명하려고된다. 더 많은 필드를 가지는 것은 매우 일반적인 시나리오입니다. 그래서 접근 방법은 django auth 사용자 모델의 inherits이거나 OneToOne 관계가있는 userprofile 모델을 만드는 것입니다. 이렇게하면 이미 구현 된 기능 중 일부를 다시 구현할 필요가 없습니다. 또한 패키지에 groupspermissions 모델이 있으며 사용자 권한 부여 측면에서 전체 기능 계층을 추가합니다.

예 :

from django.contrib.auth.models import User 
class MyCustomProfile(User): 
    #inherits all the attributes of default `User` models 
    #additional models here. 

또는

from django.contrib.auth.models import User 
class MyCustomProfile(models.Model): 
    user = models.OneToOneField(User) 
    #additional models here. 

이 방법, 당신은 모든 기능을 사용하고 그 위에 구축 할 수 있습니다.

django-1.5에서 약간 변경되어 사용자가 맞춤 입력란을 사용할 수있어 User 모델 위에 UserProfile 모델을 만들지 않아도됩니다.

+1

위대한 분명한 정보를 가져 주셔서 감사합니다. 나는이 언어를 정말 좋아한다. – doniyor

1

Django 1.5 이후 사용자 정의 필드로 사용자 모델을 만들 수 있습니다. 그리고 장고에게 인증을 위해 그 모델을 사용하라고 말한다. 문서에

링크 : Custom User Model

업데이트 : 장고 1.4을 사용하는 경우, 다음 django-primate는 사용자 정의 사용자 모델을 정의하는 데 도움이 될 수 있습니다.

+0

쿨, 고마워. 난 장고 1.4를 사용하지만 논리는 거의 동일합니다 – doniyor

1

사용자 모델에서 클래스를 파생시킵니다.

from django.contrib.auth.models import User 

class MyCustomUser(User): 
    # my properties here 
    # my custom methods here 

그런 다음 당신은 당신이 사용자 정의 사용자 클래스의 속성에 액세스 할 수 있도록 일반 사용자 대신 사용자 정의 사용자 클래스를 통과 처리하기 위해 사용자 정의 백엔드가 필요합니다.

from django.contrib.auth.backends import ModelBackend 
from django.contrib.auth.models import check_password 
from my.app.models import MyCustomUser 

class CustomUserModelBackend(ModelBackend): 
    def authenticate(self, username=None, password=None): 
     try: 
      user = MyCustomUser.objects.get(username=username) 
      if user.check_password(password): 
       return user 
     except Player.DoesNotExist: 
      return None 
     return None #Password was wrong 

    def get_user(self, user_id): 
     try: 
      return MyCustomUser.objects.get(pk=user_id) 
     except Player.DoesNotExist: 
      return None 

는 그런 다음 settings.pyAUTHENTICATION_BACKENDS 튜플에 백엔드를 추가합니다. 추가로 사용자 정의 할 수 있습니다. 구현입니다.

+0

아주 좋은, 고마워.지금 나는 논리를 잘 알고 있습니다. – doniyor