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?


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='jlennon@beatles.com',
                                 password='glass onion')

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

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.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.