Próbuję utworzyć nowego użytkownika w projekcie Django za pomocą następującego kodu, ale podświetlona linia uruchamia wyjątek.
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))
Jakaś pomoc?
Odpowiedzi:
Prawidłowym sposobem tworzenia użytkownika w Django jest użycie funkcji create_user. Pozwoli to obsłużyć haszowanie hasła itp.
from django.contrib.auth.models import User user = User.objects.create_user(username='john', email='[email protected]', password='glass onion')
źródło
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
EDYCJA: to działaDJANGO_SETTINGS_MODULE=app.settings.dev python manage.py shell < register-user.py
from django.contrib.auth import get_user_model
iuser = get_user_model().objects.create_user(...
Czy potwierdziłeś, że przekazujesz rzeczywiste wartości, a nie
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')
źródło
Zbiorcze tworzenie użytkowników za pomocą
set_password
I tworzysz kilku użytkowników testowych,
bulk_create
jest znacznie szybszy, ale nie możemycreate_user
z nim korzystać.set_password
to inny sposób na wygenerowanie zaszyfrowanych haseł: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()))
Pytanie dotyczące mieszania haseł: Jak używać Bcrypt do szyfrowania haseł w Django
Testowane w Django 1.9.
źródło
Jeśli utworzysz użytkownika normalnie, nie będziesz mógł się zalogować ponieważ metoda tworzenia hasła może być inna Możesz użyć do tego domyślnego formularza rejestracji
from django.contrib.auth.forms import UserCreationForm
Możesz to również przedłużyć
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' ]
Następnie w widoku użyj tej klasy
class UserCreate(CreateView): form_class = UserForm template_name = 'registration/signup.html' success_url = reverse_lazy('list') def form_valid(self, form): user = form.save()
źródło