2011-09-22 27 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

我不這麼認爲。但您可以代理Django用戶:

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 everest的回答。 –

14

在Django 1.4中,get_or_create()存在於用戶。

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

這不會爲用戶正確設置密碼。原始的'密碼'字段包含鹽味散列,而不是密碼本身。新創建時,您必須在用戶上調用'set_password()',然後保存(再次)。不理想。順便說一下,無論如何,你可能都想把它放在'defaults' kwarg中。 –

+0

@DavideR。這在Django 1.4中工作正常。 –

1

最好不要捕獲IntegrityError,因爲它可能會發生其他原因。您需要檢查用戶是否存在,不包括密碼。如果用戶已經存在,請設置密碼。

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