Jak stworzyć użytkownika w Django?

87

Próbuję utworzyć nowego użytkownika w projekcie Django za pomocą następującego kodu, ale podświetlona linia uruchamia wyjątek.

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

Jakaś pomoc?

Amr M. AbdulRahman
źródło
6
Jaki wyjątek?
César
2
@ user1364223 Exception traceback?
Joseph Victor Zammit
Myślę, że User.objects.create powinno działać. docs.djangoproject.com/en/1.4/ref/models/querysets/#create
iJK

Odpowiedzi:

181

Prawidłowym sposobem tworzenia użytkownika w Django jest użycie funkcji create_user. Pozwoli to obsłużyć haszowanie hasła itp.

from django.contrib.auth.models import User
user = User.objects.create_user(username='john',
                                 email='[email protected]',
                                 password='glass onion')
keithhackbarth
źródło
czy to hashuje hasło?
mp3por,
8
@ mp3por - Tak. Pełną dokumentację można znaleźć tutaj docs.djangoproject.com/en/1.9/ref/contrib/auth/…
keithhackbarth
2
jak / gdzie mam to uruchomić? Jeśli po prostu uruchomię ten kod, otrzymam django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.EDYCJA: to działaDJANGO_SETTINGS_MODULE=app.settings.dev python manage.py shell < register-user.py
citynorman
3
Jako aktualizacja dla bardziej nowoczesnego Django, użyj from django.contrib.auth import get_user_modeliuser = get_user_model().objects.create_user(...
Mark Chackerian
@keithhackbarth w którym pliku powinienem wstawić ten kod w strukturze pliku django?
Hangon
23

Czy potwierdziłeś, że przekazujesz 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')
Burhan Khalid
źródło
1
Jeśli są to wartości None, czy metoda .is_valid () nie powiedzie się?
mp3por,
11

Zbiorcze tworzenie użytkowników za pomocą set_password

I tworzysz kilku użytkowników testowych, bulk_createjest znacznie szybszy, ale nie możemy create_userz nim korzystać.

set_password to inny sposób na wygenerowanie zaszyfrowanych haseł:

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 dotyczące mieszania haseł: Jak używać Bcrypt do szyfrowania haseł w Django

Testowane w Django 1.9.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
źródło
1
znacznie lepsze niż akceptowane; Jeśli rozważasz programowe dodanie użytkownika, prawdopodobnie zautomatyzujesz coś do większej liczby zastosowań.
Sławomir Lenart
5

Jeśli utworzysz użytkownika normalnie, nie będziesz mógł się zalogować ponieważ metoda tworzenia hasła może być inna Możesz użyć do tego domyślnego formularza rejestracji

from django.contrib.auth.forms import UserCreationForm

Możesz to również przedłużyć

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

Następnie w widoku użyj tej klasy

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

    def form_valid(self, form):
        user = form.save()
Nids Barthwal
źródło
1
Myślę, że jest błąd podczas tworzenia UserForm poprzez rozszerzenie forms.ModelForm. Myślę, że zamiast tego powinien rozszerzyć UserCreationForm
vladimir.gorea
Ponadto, czy form_class widoku klasy UserCreate nie powinien być UserForm?
vladimir.gorea