2011-09-22 13 views
15

Bir kullanıcı eklemek için aşağıdaki şablondan daha basit bir yol var mı?Kullanıcı eklemek için get_or_create eşdeğeri

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 

cevap

4

Sanmıyorum. Ama Django User proxify edebilirsiniz:

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

Şimdi, bkz. Everest'in cevabı. –

14

Django 1.4 yılında get_or_create() Kullanıcı için mevcuttur.

from django.contrib.auth.models import User 

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

Bu örnekte, '_user' bir tuple' olacaktır (user_object, was_just_created) '. –

+4

Bu, kullanıcının şifresini doğru şekilde ayarlamaz. Ham 'parola 'alanı parola değil, tuzlanmış karma tutar. Yeni oluşturulduğunda kullanıcı üzerinde set_password() 'yi çağırmanız ve daha sonra kaydetmeniz (tekrar) yapmanız gerekir. Uygun değil. Bu arada, muhtemelen zaten 'varsayılan' kwarg içinde sahip olmak istedim. –

+0

@DavideR. Bu Django 1.4'te gayet iyi çalışıyor. –

1

O başka nedenlerden dolayı ortaya çıkabilir olarak IntegrityError yakalamak için daha iyi değil. Parola hariç, kullanıcının var olup olmadığını kontrol etmeniz gerekir. Kullanıcı zaten mevcutsa, şifreyi ayarlayın.

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