Ich versuche, mit dem folgenden Code einen neuen Benutzer in einem Django-Projekt zu erstellen, aber die hervorgehobene Zeile löst eine Ausnahme aus.
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))
Irgendeine Hilfe?
Antworten:
Der richtige Weg, einen Benutzer in Django zu erstellen, ist die Verwendung der Funktion create_user. Dies wird das Hashing des Passworts usw. behandeln.
from django.contrib.auth.models import User user = User.objects.create_user(username='john', email='[email protected]', password='glass onion')
quelle
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
EDIT: das funktioniertDJANGO_SETTINGS_MODULE=app.settings.dev python manage.py shell < register-user.py
from django.contrib.auth import get_user_model
unduser = get_user_model().objects.create_user(...
Haben Sie bestätigt, dass Sie tatsächliche Werte übergeben und nicht
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')
quelle
Massenbenutzererstellung mit
set_password
Wenn Sie mehrere Testbenutzer erstellen,
bulk_create
ist dies viel schneller, aber wir können es nicht verwendencreate_user
.set_password
ist eine andere Möglichkeit, die Hash-Passwörter zu generieren: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()))
Spezifische Frage zum Passwort-Hashing: Verwendung von Bcrypt zum Verschlüsseln von Passwörtern in Django
Getestet in Django 1.9.
quelle
Wenn Sie den Benutzer normal erstellen, können Sie sich nicht anmelden, da die Methode zur Kennworterstellung möglicherweise anders ist. Sie können hierfür das Standardanmeldeformular verwenden
from django.contrib.auth.forms import UserCreationForm
Sie können das auch erweitern
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' ]
Verwenden Sie dann in der Ansicht diese Klasse
class UserCreate(CreateView): form_class = UserForm template_name = 'registration/signup.html' success_url = reverse_lazy('list') def form_valid(self, form): user = form.save()
quelle