2012-04-29 13 views
34

Estoy tratando de crear un nuevo usuario en un proyecto de Django con el siguiente código, pero la línea resaltada dispara una excepción.¿Cómo crear un usuario en Django?

def createUser(request): 
    userName = request.REQUEST.get('username', None) 
    userPass = request.REQUEST.get('password', None) 
    userMail = request.REQUEST.get('email', None) 

    # TODO: check if already existed 

    **user = User.objects.create_user(userName, userMail, userPass)** 
    user.save() 

    return render_to_response('home.html', context_instance=RequestContext(request)) 

¿Algún ayuda?

+4

qué tipo de excepción? –

+2

@ user1364223 ¿Retroceso de excepción? –

+0

Creo que User.objects.create debería funcionar. https://docs.djangoproject.com/en/1.4/ref/models/querysets/#create – iJK

Respuesta

90

La forma correcta de crear un usuario en Django es usar la función create_user. Esto manejar el hash de la contraseña, etc ..

from django.contrib.auth.models import User 
user = User.objects.create_user(username='john', 
           email='[email protected]', 
           password='glass onion') 
+0

¿Esta contraseña será hash? – mp3por

+3

@ mp3por - Sí. Para obtener la documentación completa, vaya a https://docs.djangoproject.com/en/1.9/ref/contrib/auth/#django.contrib.auth.models.UserManager.create_user – keithhackbarth

+0

cómo/dónde ejecuto esto? Si solo ejecuto ese código, obtengo 'django.core.exceptions.AppRegistryNotReady: las aplicaciones aún no están cargadas. 'EDITAR: esto funciona' DJANGO_SETTINGS_MODULE = app.settings.dev python manage.py shell citynorman

18

¿Ha confirmado que está pasando valores reales y no None?

from django.shortcuts import render 

def createUser(request): 
    userName = request.REQUEST.get('username', None) 
    userPass = request.REQUEST.get('password', None) 
    userMail = request.REQUEST.get('email', None) 

    # TODO: check if already existed 
    if userName and userPass and userMail: 
     u,created = User.objects.get_or_create(userName, userMail) 
     if created: 
      # user was created 
      # set the password here 
     else: 
      # user was retrieved 
    else: 
     # request was empty 

    return render(request,'home.html') 
+1

Si son None, ¿no funciona el método .is_valid()? – mp3por

6

creación de usuarios a granel con set_password

que va a crear varios usuarios de prueba, bulk_create es mucho más rápido, pero no podemos utilizar create_user con eso.

set_password es otra manera de generar las contraseñas hash:

def users_iterator(): 
    for i in range(nusers): 
     is_superuser = (i == 0) 
     user = User(
      first_name='First' + str(i), 
      is_staff=is_superuser, 
      is_superuser=is_superuser, 
      last_name='Last' + str(i), 
      username='user' + str(i), 
     ) 
     user.set_password('asdfqwer') 
     yield user 

class Command(BaseCommand): 
    def handle(self, **options): 
     User.objects.bulk_create(iter(users_iterator())) 

pregunta específica sobre hash de la clave: How to use Bcrypt to encrypt passwords in Django

Probado en Django 1.9.

+1

mucho mejor que aceptado; si está considerando agregar usuarios mediante programación, probablemente automatice algo para más usos. –

2

Si el usuario creat Normalmente, usted no será capaz de iniciar la sesión como método de creación de la contraseña puede diferentes B Puede utilizar formulario de registro por defecto para que

from django.contrib.auth.forms import UserCreationForm 

, se puede extender también

from django.contrib.auth.forms import UserCreationForm 

class UserForm(forms.ModelForm): 
    mobile = forms.CharField(max_length=15, min_length=10) 
    email = forms.EmailField(required=True) 
    class Meta: 
     model = User 
     fields = ['username', 'password', 'first_name', 'last_name', 'email', 'mobile' ] 

Luego, en vista de utilizar esta clase

class UserCreate(CreateView): 
    form_class = SignUpForm 
    template_name = 'registration/signup.html' 
    success_url = reverse_lazy('list') 

    def form_valid(self, form): 
     user = form.save() 
+0

Creo que hay un error al crear UserForm extendiendo forms.ModelForm. Creo que debería extender UserCreationForm en su lugar –

+0

Además, ¿no debería el form_class de la vista de clase UserCreate ser UserForm? –

Cuestiones relacionadas