Como criar um usuário no Django?

87

Estou tentando criar um novo usuário em um projeto Django pelo código a seguir, mas a linha destacada dispara uma exceção.

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

Qualquer ajuda?

Amr M. AbdulRahman
fonte
6
Que tipo de exceção?
César
2
@ user1364223 Rastreamento de exceção?
Joseph Victor Zammit
Acho que User.objects.create deve funcionar. docs.djangoproject.com/en/1.4/ref/models/querysets/#create
iJK

Respostas:

181

A maneira correta de criar um usuário no Django é usar a função create_user. Isso vai lidar com o hashing da senha, etc.

from django.contrib.auth.models import User
user = User.objects.create_user(username='john',
                                 email='[email protected]',
                                 password='glass onion')
Keithhackbarth
fonte
isso fará o hash da senha?
mp3por
8
@ mp3por - Sim. Para a documentação completa, acesse docs.djangoproject.com/en/1.9/ref/contrib/auth/…
keithhackbarth
2
como / onde faço isso? Se eu apenas executar esse código, recebo django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.EDIT: isso funcionaDJANGO_SETTINGS_MODULE=app.settings.dev python manage.py shell < register-user.py
citynorman
3
Como uma atualização para um Django mais moderno, use from django.contrib.auth import get_user_modeleuser = get_user_model().objects.create_user(...
Mark Chackerian
@keithhackbarth em qual arquivo devo inserir este código na estrutura do arquivo django?
Hangon
23

Você confirmou que está passando os valores reais e não 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
fonte
1
Se eles forem Nenhum, o método .is_valid () falhará?
mp3por de
11

Criação de usuários em massa com set_password

Se você está criando vários usuários de teste, bulk_createé muito mais rápido, mas não podemos usar create_usercom ele.

set_password é outra maneira de gerar as senhas com hash:

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

Pergunta específica sobre hashing de senha: Como usar Bcrypt para criptografar senhas no Django

Testado em Django 1.9.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fonte
1
muito melhor do que aceito; se você está pensando em adicionar um usuário programaticamente, provavelmente automatizará algo para mais usos.
Sławomir Lenart
5

Se você criar um usuário normalmente, não será capaz de fazer o login, pois o método de criação de senha pode ser diferente. Você pode usar o formulário de inscrição padrão para isso

from django.contrib.auth.forms import UserCreationForm

Você pode estender isso também

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

Então, em vista de usar esta classe

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
fonte
1
Eu acho que há um erro ao criar UserForm estendendo forms.ModelForm. Eu acho que deveria estender UserCreationForm em vez disso
vladimir.gorea
Além disso, o form_class da visão de classe UserCreate não deveria ser UserForm?
vladimir.gorea