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?


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='jlennon@beatles.com',
                                 password='glass onion')

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

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.


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.