2012-07-18 8 views
5

메서드의 일부 의심스러운 동작이 발생했습니다 User 개체 관리자입니다. 이 방법을 사용하면 password 필드는 User 개체를 만드는 데 필요하지 않습니다. 결과적으로 User은 공란으로 password이됩니다. create_user 메서드를 사용하고 password을 지정하지 않은 경우 사용할 수없는 암호가있는 User을 만듭니다 (set_unusable_password()까지).사용자 관리자 메서드() 및 create_user()

메서드가 없이 사용자를 만들려고 할 때 raise exception이 아닌 이유를 확신하지 못합니다. 문서에서이 필드는 필수 항목입니다. create() 방법/설명서에 문제가 있습니까?

답변

9

. 당신이 관리 명령 python manage.py sql을 실행하면

  1. 에서, auth_user 스키마에주의 : SQL에서

    CREATE TABLE "auth_user" (
        ... 
        "password" varchar(128) NOT NULL, 
        ... 
    ) 
    

    , 빈 문자열, ''User 인스턴스에 QuerySet.create() 방법을 사용하여 두 가지 문제가 있습니다 는 NULL과 같지 않습니다 (예 : ISNULL('') != TRUE).

  2. QuerySet.create()QuerySet.update()모델 검증를 트리거하지 않습니다. 모델 유효성 검사는 ModelForm 인스턴스가 Model.full_clean() 인스턴스 메소드를 호출 할 때만 발생합니다.

    QuerySet API를 사용하는 컨텍스트에서 유효성 검사 오류를 발생 시키면 장고에서는 의미가 없습니다. 그렇기 때문에 CharField().validate(value='', None)이 빈 문자열에 ValidationError을 붙이더라도 User.objects.create(username='foo', password='')과 같은 것을 할 수 있습니다. 위의 이유로

, 당신은 User.objects.create()를 사용하는 연기와 모델의 사용자 관리자에서 공급 User.objects.create_user() 방법에 의존한다.

+0

멋진 확장 답변 :-) –

0

장고의 소스 사용자 모델 봐, 거기에 사용자 지정 관리자의 니펫을 :

사용자 모델은 사용자를 만들기위한 UserManager.create_user() 방법으로 사용자 지정 관리자가 정확히 왜
class UserManager(models.Manager): 
    # ... 
    def create_user(self, username, email=None, password=None): 
     """ 
     Creates and saves a User with the given username, email and password. 
     """ 
     now = timezone.now() 
     if not username: 
      raise ValueError('The given username must be set') 
     email = UserManager.normalize_email(email) 
     user = self.model(username=username, email=email, 
          is_staff=False, is_active=True, is_superuser=False, 
          last_login=now, date_joined=now) 

     user.set_password(password) 
     user.save(using=self._db) 
     return user 
+1

나는 create_user에 암호가 필요 없다는 것을 알고 있습니다. 일부 외부 소스에 대해 인증하는 경우 구현되었습니다. 난 그냥 사용자의 관리자 create() 메서드에 대한 적절한 동작이 아니라고 생각. – sunprophit

+1

아니요, 사용자 정의 된 사용자 정의 관리자가 있기 때문에 동일한 변수 'objects'를 사용하므로 –