Как создать пользователя в 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')
Keithhackbarth
источник
будет ли этот хеш-пароль?
mp3por
8
@ mp3por - Да. Полную документацию можно найти здесь docs.djangoproject.com/en/1.9/ref/contrib/auth/…
keithhackbarth
2
как / где мне это запустить? Если я просто запустил этот код, я получу django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.РЕДАКТИРОВАТЬ: это работает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?
Hangon,
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
Если они равны None, не сработает ли метод .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 путем расширения forms.ModelForm. Я думаю, что вместо этого следует расширить UserCreationForm
vladimir.gorea
Кроме того, не должен ли form_class представления класса UserCreate быть UserForm?
vladimir.gorea