Як створити користувача в Django?


87

Я намагаюся створити нового користувача в проекті 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))

Будь-яка допомога?


6
Який виняток?
Сезар,

2
@ user1364223 Виняток трасування назад?
Джозеф Віктор Замміт,

Я думаю, що User.objects.create повинен працювати. docs.djangoproject.com/en/1.4/ref/models/querysets/#create
iJK

Відповіді:


181

Правильним способом створення користувача в Django є використання функції create_user. Це буде обробляти хешування пароля тощо.

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

це хеш пароль?
mp3por

8
@ mp3por - Так. Повну документацію читайте тут docs.djangoproject.com/en/1.9/ref/contrib/auth/…
keithhackbarth

2
як / де мені це запустити? Якщо я просто запустив цей код, я отримую django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.EDIT: це працюєDJANGO_SETTINGS_MODULE=app.settings.dev python manage.py shell < register-user.py
citynorman

3
В якості оновлення для більш сучасного Django використовуйте from django.contrib.auth import get_user_modelтаuser = get_user_model().objects.create_user(...
Марк Чакеріан

@keithhackbarth, в який файл слід вставити цей код у структуру файлу django?
Хангон,

23

Ви підтвердили, що передаєте фактичні значення, а ні 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
Якщо вони відсутні, звичка методу .is_valid () не вдається?
mp3por

11

Масове створення користувачів за допомогою set_password

Я створюю декількох тестових користувачів, bulk_createце набагато швидше, але ми не можемо create_userз цим користуватися.

set_password це ще один спосіб генерувати хешовані паролі:

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

Питання, що стосується хешування паролів: Як використовувати Bcrypt для шифрування паролів у Django

Перевірено в Django 1.9.


1
набагато краще, ніж прийнято; якщо ви розглядаєте можливість програмного додавання користувача, ви, ймовірно, щось автоматизуєте для більшого використання.
Славомір Ленарт,

5

Якщо ви створюєте користувача зазвичай, ви не зможете увійти, оскільки спосіб створення пароля може відрізнятися. Ви можете використовувати форму реєстрації за замовчуванням для цього

from django.contrib.auth.forms import UserCreationForm

Ви також можете продовжити це

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

Тоді з огляду використовуйте цей клас

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
Я думаю, що є помилка при створенні UserForm шляхом розширення форм.ModelForm. Я думаю, що натомість слід розширити UserCreationForm
vladimir.gorea

Крім того, чи не повинен form_class представлення класу UserCreate бути UserForm?
vladimir.gorea
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.