2012-04-29 13 views
34

Próbuję utworzyć nowego użytkownika w projekcie Django następującym kodem, ale podświetlona linia uruchamia wyjątek.Jak utworzyć użytkownika w 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)) 

Każda pomoc?

+4

Jaki rodzaj wyjątku? –

+2

@ user1364223 Wyjątek traceback? –

+0

Myślę, że User.objects.create powinien działać. https://docs.djangoproject.com/en/1.4/ref/models/querysets/#create – iJK

Odpowiedz

90

Poprawnym sposobem utworzenia użytkownika w Django jest użycie funkcji create_user. Będzie to obsłużyć wycieniowanie hasło itp ..

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

będzie to hash hasło? – mp3por

+3

@ mp3por - Tak. Aby uzyskać pełną dokumentację, przejdź tutaj https://docs.djangoproject.com/en/1.9/ref/contrib/auth/#django.contrib.auth.models.UserManager.create_user – keithhackbarth

+0

jak/gdzie mam to uruchomić? Jeżeli po prostu uruchomić ten kod uzyskać 'django.core.exceptions.AppRegistryNotReady: Aplikacje nie są ładowane yet.' EDIT: to działa' DJANGO_SETTINGS_MODULE = app.settings.dev python manage.py shell citynorman

18

Czy potwierdziłeś, że podajesz rzeczywiste wartości, a nie 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

Jeśli nie są, czy metoda .is_valid() nie działa? – mp3por

6

luzem utworzenie użytkownika z set_password

I tworzysz kilku użytkowników testowych bulk_create jest znacznie szybsze, ale nie możemy użyć create_user z tym.

set_password jest inny sposób generować zakodowane hasła:

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

Pytanie o konkretne hasło mieszaja: How to use Bcrypt to encrypt passwords in Django

Testowany w Django 1.9.

+1

znacznie lepsze niż akceptowane; jeśli zastanawiasz się programowo dodawać użytkownika, prawdopodobnie zautomatyzujesz coś dla większej liczby zastosowań. –

2

Jeśli creat użytkownik normalnie, nie będzie mógł zalogować się jako metody tworzenia haseł może b inna Można użyć domyślny formularz rejestracyjny dla tego

from django.contrib.auth.forms import UserCreationForm 

Można przedłużyć ten także

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

W takim razie użyj tej klasy

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

Myślę, że podczas tworzenia UserForm jest błąd podczas rozszerzania form.ModelForm. Myślę, że powinno to przedłużyć UserCreationForm zamiast –

+0

Co więcej, czy klasa form_z widoku UserCreate nie powinna być UserForm? –

Powiązane problemy