Come creare un utente in Django?


92

Sto cercando di creare un nuovo utente in un progetto Django con il codice seguente, ma la riga evidenziata genera un'eccezione.

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))

Qualsiasi aiuto?


6
Che tipo di eccezione?
César

2
@ user1364223 Eccezione traceback?
Joseph Victor Zammit

Penso che User.objects.create dovrebbe funzionare. docs.djangoproject.com/en/1.4/ref/models/querysets/#create
iJK

Risposte:


189

Il modo corretto per creare un utente in Django è usare la funzione create_user. Questo gestirà l'hashing della password, ecc.

from django.contrib.auth.models import User
user = User.objects.create_user(username='john',
                                 email='jlennon@beatles.com',
                                 password='glass onion')

questo hash la password?
mp3por

8
@ mp3por - Sì. Per la documentazione completa, vai qui docs.djangoproject.com/en/1.9/ref/contrib/auth/…
keithhackbarth

2
come / dove lo eseguo? Se django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.DJANGO_SETTINGS_MODULE=app.settings.dev python manage.py shell < register-user.py
eseguo

4
Come aggiornamento per Django più moderno, usa from django.contrib.auth import get_user_modeleuser = get_user_model().objects.create_user(...
Mark Chackerian

@keithhackbarth in quale file devo inserire questo codice nella struttura del file django?
Hangon

23

Hai confermato che stai passando i valori effettivi e non 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
Se sono Nessuno, il metodo .is_valid () fallirà?
mp3por

11

Creazione di utenti in blocco con set_password

Se stai creando diversi utenti di prova, bulk_createè molto più veloce, ma non possiamo usarlo create_user.

set_password è un altro modo per generare le password con 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()))

Domanda specifica sull'hashing delle password: come utilizzare Bcrypt per crittografare le password in Django

Testato in Django 1.9.


1
molto meglio di quanto accettato; se stai pensando di aggiungere un utente programmaticamente, probabilmente automatizzi qualcosa per più usi.
Sławomir Lenart

5

Se crei un utente normalmente, non sarai in grado di accedere poiché il metodo di creazione della password potrebbe essere diverso Puoi utilizzare il modulo di registrazione predefinito per questo

from django.contrib.auth.forms import UserCreationForm

Puoi estendere anche quello

from django.contrib.auth.forms import UserCreationForm

class UserForm(UserCreationForm):
    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' ]

Quindi in vista usa questa classe

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

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

1
Penso che ci sia un errore durante la creazione di UserForm estendendo forms.ModelForm. Penso che dovrebbe invece estendere UserCreationForm
vladimir.gorea

Inoltre, la form_class della vista della classe UserCreate non dovrebbe essere UserForm?
vladimir.gorea
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.