2011-09-22 17 views
15

Czy istnieje prostszy sposób dodania użytkownika niż z poniższym wzorem?Równoważnik get_or_create dla dodawania użytkowników

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 

Odpowiedz

4

Nie sądzę. Ale możesz popytować użytkownika 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

Robi to teraz, patrz odpowiedź @nu everest. –

14

W Django 1.4, dla użytkownika istnieje get_or_create().

from django.contrib.auth.models import User 

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

W tym przykładzie '_user' będzie krotką' (user_object, was_just_created) '. –

+4

To nie ustawi poprawnie hasła dla użytkownika. Surowe pole 'password' zawiera solący hash, a nie samo hasło. Musiałbyś wywołać 'set_password()' na użytkowniku, gdy jest on nowo utworzony, a następnie zapisać go (ponownie). Nieidealny. A tak przy okazji, pewnie chciałeś mieć go w "defaults" kwarg. –

+0

@DavideR. Działa to dobrze w Django 1.4. –

1

Lepiej nie złapać IntegrityError, ponieważ może się zdarzyć z innych przyczyn. Musisz sprawdzić, czy istnieje użytkownik, wyłączając hasło. Jeśli użytkownik już istnieje, ustaw hasło.

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