Comment créer un utilisateur dans Django?

87

J'essaie de créer un nouvel utilisateur dans un projet Django par le code suivant, mais la ligne en surbrillance déclenche une exception.

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

De l'aide?

Amr M. AbdulRahman
la source
6
Quel genre d'exception?
César
2
@ user1364223 Suivi d'exception?
Joseph Victor Zammit
Je pense que User.objects.create devrait fonctionner. docs.djangoproject.com/en/1.4/ref/models/querysets/#create
iJK

Réponses:

181

La bonne façon de créer un utilisateur dans Django est d'utiliser la fonction create_user. Cela gérera le hachage du mot de passe, etc.

from django.contrib.auth.models import User
user = User.objects.create_user(username='john',
                                 email='[email protected]',
                                 password='glass onion')
keithhackbarth
la source
cela hachera-t-il le mot de passe?
mp3por
8
@ mp3por - Oui. Pour la documentation complète, rendez-vous ici docs.djangoproject.com/en/1.9/ref/contrib/auth/…
keithhackbarth
2
comment / où dois-je exécuter ceci? Si je lance simplement ce code, j'obtiens django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.EDIT: cela fonctionneDJANGO_SETTINGS_MODULE=app.settings.dev python manage.py shell < register-user.py
citynorman
3
Comme une mise à jour pour Django plus moderne, utilisez from django.contrib.auth import get_user_modeletuser = get_user_model().objects.create_user(...
Mark Chackerian
@keithhackbarth dans quel fichier dois-je insérer ce code dans la structure de fichier django?
Hangon le
23

Avez-vous confirmé que vous transmettez des valeurs réelles et non 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
la source
1
S'ils sont None, la méthode .is_valid () échouera-t-elle?
mp3por
11

Création d'utilisateurs en masse avec set_password

Si vous créez plusieurs utilisateurs de test, bulk_createc'est beaucoup plus rapide, mais nous ne pouvons pas l'utiliser create_useravec.

set_password est une autre façon de générer les mots de passe hachés:

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

Question spécifique sur le hachage de mot de passe: Comment utiliser Bcrypt pour crypter les mots de passe dans Django

Testé dans Django 1.9.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
la source
1
bien mieux qu'accepté; si vous envisagez d'ajouter un utilisateur par programme, vous automatisez probablement quelque chose pour plus d'utilisations.
Sławomir Lenart du
5

Si vous créez un utilisateur normalement, vous ne pourrez pas vous connecter car la méthode de création de mot de passe peut être différente Vous pouvez utiliser le formulaire d'inscription par défaut pour cela

from django.contrib.auth.forms import UserCreationForm

Vous pouvez étendre cela aussi

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

Alors en vue, utilisez cette 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()
Nids Barthwal
la source
1
Je pense qu'il y a une erreur lors de la création de UserForm en étendant forms.ModelForm. Je pense qu'il devrait plutôt étendre UserCreationForm
vladimir.gorea
De plus, la form_class de la vue de classe UserCreate ne devrait-elle pas être UserForm?
vladimir.gorea