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?
Respostas:
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')
fonte
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
EDIT: isso funcionaDJANGO_SETTINGS_MODULE=app.settings.dev python manage.py shell < register-user.py
from django.contrib.auth import get_user_model
euser = get_user_model().objects.create_user(...
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')
fonte
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 usarcreate_user
com 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.
fonte
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()
fonte