2012-04-29 2 views
34

Я пытаюсь создать нового пользователя в проекте Django по следующему коду, но выделенная строка вызывает исключение.Как создать пользователя в 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)) 

Любая помощь?

+4

КАКОГО исключение? –

+2

@ user1364223 Exception traceback? –

+0

Я думаю, что User.objects.create должен работать. https://docs.djangoproject.com/en/1.4/ref/models/querysets/#create – iJK

ответ

90

Правильный способ создания пользователя в Django - использовать функцию create_user. Это будет обрабатывать хэширования пароля, и т.д ..

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

будет ли этот хэш-пароль? – mp3por

+3

@ mp3por - Да. Для получения полной документации перейдите по ссылке https://docs.djangoproject.com/en/1.9/ref/contrib/auth/#django.contrib.auth.models.UserManager.create_user – keithhackbarth

+0

как я могу ее запустить? Если я просто запускаю этот код, я получаю 'django.core.exceptions.AppRegistryNotReady: приложения еще не загружены. 'EDIT: это работает' DJANGO_SETTINGS_MODULE = app.settings.dev python manage.py shell citynorman

18

Вы подтвердили, что передаете фактические значения, а не 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

6

Массовое создание пользователя с set_password

I вы создаете несколько тестовых пользователей, 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())) 

Вопрос о конкретном хэшировании паролей: How to use Bcrypt to encrypt passwords in Django

Испытан в Django 1.9.

+1

гораздо лучше, чем принято; если вы планируете программно добавить пользователя, вы, вероятно, автоматизируете что-то для большего использования. –

2

Если вы Creat пользователь обычно, вы не сможете войти в систему в качестве метода создания пароля может б разные Вы можете использовать форму регистрации по умолчанию для этого

from django.contrib.auth.forms import UserCreationForm 

Вы можете расширить это также

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

Тогда в силе использовать этот класс

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

Я думаю, что существует ошибка при создании UserForm путем расширения форм .ModelForm. Я думаю, что это должно расширить UserCreationForm вместо –

+0

Кроме того, не должно быть form_class класса UserCreate класса UserForm? –

Смежные вопросы