2012-04-29 18 views
34

Sto provando a creare un nuovo utente in un progetto Django con il seguente codice, ma la linea evidenziata emette un'eccezione.Come creare un utente in 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)) 

Qualsiasi aiuto?

+4

che tipo di eccezione? –

+2

@ user1364223 traceback di eccezione? –

+0

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

risposta

90

Il modo corretto per creare un utente in Django è utilizzare la funzione create_user. Ciò consente di gestire l'hashing della password, ecc ..

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

questa hash la password? – mp3por

+3

@ mp3por - Sì. Per la documentazione completa, andare qui https://docs.djangoproject.com/en/1.9/ref/contrib/auth/#django.contrib.auth.models.UserManager.create_user – keithhackbarth

+0

come/dove si esegue questo? Se eseguo semplicemente quel codice, ottengo 'django.core.exceptions.AppRegistryNotReady: Le app non sono ancora caricate. EDIT: funziona' DJANGO_SETTINGS_MODULE = app.settings.dev python manage.py shell citynorman

18

Hai confermato che stai passando 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 None, il metodo .is_valid() fallisce? – mp3por

6

creazione dell'utente Bulk con set_password

mi si creano più utenti di prova, bulk_create è molto più veloce, ma non possiamo usare create_user con esso.

set_password è un altro modo per generare le password 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 su hashing delle password: How to use Bcrypt to encrypt passwords in Django

testato in Django 1.9.

+1

molto meglio di quanto accettato; se stai pensando di aggiungere un utente a livello di codice, probabilmente automatizzi qualcosa per più usi. –

2

Se utente creat normalmente, non sarà in grado di accedere come metodo di creazione della password May B diverso È possibile utilizzare modulo di iscrizione di default per quel

from django.contrib.auth.forms import UserCreationForm 

È possibile estendere che anche

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' ] 

Poi, in vista utilizzare questa classe

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

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

+0

Inoltre, non dovrebbe la form_class della vista della classe UserCreate essere UserForm? –

Problemi correlati