2011-09-22 11 views
15

¿Hay alguna manera más sencilla de agregar un usuario que con el siguiente patrón?Equivalente a get_or_create para agregar usuarios

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 

Respuesta

4

No lo creo. Pero se puede Proxify el usuario 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

Lo hace ahora, ver la respuesta de @nu everest. –

14

En Django 1.4, existe get_or_create() para el usuario.

from django.contrib.auth.models import User 

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

En este ejemplo, '_user' será una tupla' (user_object, was_just_created) '. –

+4

Esto no configurará correctamente la contraseña para el usuario. El campo raw 'password' contiene el hash salado, no la contraseña en sí. Debería llamar 'set_password()' al usuario cuando se acaba de crear, y luego guardarlo (nuevamente). No es ideal. Por cierto, probablemente quieras tenerlo en el kwarg 'default' de todos modos. –

+0

@DavideR. Esto funciona bien en Django 1.4. –

1

Es mejor no coger IntegrityError, ya que puede ocurrir por otras razones. Debe verificar si el usuario existe, excluyendo la contraseña. Si el usuario ya existe, configure la contraseña.

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