2011-09-22 3 views
15

다음 패턴을 사용하는 것보다 사용자를 추가하는 간단한 방법이 있습니까?사용자 추가를위한 get_or_create와 같습니다.

try: 
     new_user = User.objects.create_user(username, email, password) 
    except IntegrityError: 
     messages.info(request, "This user already exists.") 
    else: 
     new_user.first_name = first_name 
     # continue with other things 

답변

4

저는 그렇게 생각하지 않습니다. 하지만 장고 사용자에게 proxify 할 수 있습니다 :

class MyUser(User): 
    class Meta: 
     proxy = True 

    def get_or_create(self, username, email, password, *args, **kwargs): 
     try: 
      new_user = User.objects.create_user(username, email, password) 
     except IntegrityError: 
      return User.objects.get(username=username, email=email) 
     else: 
      new_user.first_name = kwargs['first_name'] # or what you want 
      ...etc... 

     return new_user 
+1

@nu 에베레스트의 답변을 참조하십시오. –

14

Django 1.4에서는 get_or_create()가 User에 존재합니다.

from django.contrib.auth.models import User 

_user = User.objects.get_or_create(
     username=u'bob', 
     password=u'bobspassword', 
    ) 
+1

이 예제에서,'_user'는'(user_object, was_just_created) 튜플이 될 것입니다. –

+4

이것은 사용자의 암호를 올바르게 설정하지 않습니다. 원시'password' 필드는 암호 자체가 아니라 소금에 절인 해쉬를 가지고 있습니다. 새로 생성 될 때 사용자에게'set_password()'를 호출 한 다음 (다시) 저장해야합니다. 이상적이지 않습니다. 그건 그렇고, 당신은 아마도'defaults' kwarg에 갖고 싶어했을 것입니다. –

+0

@DavideR. 이것은 장고 1.4에서 잘 동작합니다. –

1

다른 이유로 인해 발생할 수 있으므로 IntegrityError을 잡지 않는 것이 좋습니다. 암호가없는 사용자가 있는지 확인해야합니다. 사용자가 이미있는 경우 암호를 설정하십시오.

user, created = User.objects.get_or_create(username=username, email=email) 
if not created: 
    user.set_password(password) 
관련 문제