Wie erstelle ich einen Benutzer in Django?

87

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?

Amr M. AbdulRahman
quelle
6
Was für eine Ausnahme?
César
2
@ user1364223 Ausnahme Traceback?
Joseph Victor Zammit
Ich denke, User.objects.create sollte funktionieren. docs.djangoproject.com/de/1.4/ref/models/querysets/#create
iJK

Antworten:

179

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')
keithhackbarth
quelle
Wird dies das Passwort hashen?
mp3por
8
@ mp3por - Ja. Die vollständige Dokumentation finden Sie hier docs.djangoproject.com/de/1.9/ref/contrib/auth/…
keithhackbarth
2
Wie / wo führe ich das aus? Wenn ich nur diesen Code ausführe, bekomme ich django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.EDIT: das funktioniertDJANGO_SETTINGS_MODULE=app.settings.dev python manage.py shell < register-user.py
citynorman
2
Verwenden Sie als Update für modernere Django from django.contrib.auth import get_user_modelunduser = get_user_model().objects.create_user(...
Mark Chackerian
@keithhackbarth In welche Datei soll ich diesen Code in die Django-Dateistruktur einfügen?
Hangon
23

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')
Burhan Khalid
quelle
1
Wenn sie None sind, schlägt die Methode .is_valid () nicht fehl?
mp3por
11

Massenbenutzererstellung mit set_password

Wenn Sie mehrere Testbenutzer erstellen, bulk_createist dies viel schneller, aber wir können es nicht verwenden create_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.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
1
viel besser als akzeptiert; Wenn Sie erwägen, Benutzer programmgesteuert hinzuzufügen, automatisieren Sie wahrscheinlich etwas für weitere Zwecke.
Sławomir Lenart
5

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()
Nids Barthwal
quelle
1
Ich denke, es gibt einen Fehler beim Erstellen von UserForm durch Erweitern von forms.ModelForm. Ich denke, es sollte stattdessen UserCreationForm erweitern
vladimir.gorea
Sollte die form_class der UserCreate-Klassenansicht nicht UserForm sein?
vladimir.gorea