Django'da nasıl kullanıcı oluşturulur?


92

Aşağıdaki kodla bir Django projesinde yeni bir Kullanıcı oluşturmaya çalışıyorum, ancak vurgulanan satır bir istisna başlatıyor.

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

Herhangi bir yardım?


6
Ne tür bir istisna?
César

2
@ user1364223 Özel durum traceback?
Joseph Victor Zammit

Bence User.objects.create çalışmalı. docs.djangoproject.com/en/1.4/ref/models/querysets/#create
iJK

Yanıtlar:


189

Django'da bir kullanıcı oluşturmanın doğru yolu create_user işlevini kullanmaktır. Bu, şifrenin, vb. Karma işlemlerini halledecektir.

from django.contrib.auth.models import User
user = User.objects.create_user(username='john',
                                 email='jlennon@beatles.com',
                                 password='glass onion')

bu şifreyi karıştıracak mı?
mp3por

8
@ mp3por - Evet. Belgelerin tamamı için buraya gidin docs.djangoproject.com/en/1.9/ref/contrib/auth/…
keithhackbarth

2
bunu nasıl / nerede çalıştırırım? Bu kodu çalıştırırsam django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.EDIT alırım : bu işe DJANGO_SETTINGS_MODULE=app.settings.dev python manage.py shell < register-user.py
yarar

4
Daha modern Django için güncelleme olarak, from django.contrib.auth import get_user_modelveuser = get_user_model().objects.create_user(...
Mark Chackerian'ı

@keithhackbarth Bu kodu django dosya yapısına hangi dosyaya eklemeliyim?
Hangon

23

Gerçek değerleri geçtiğinizi ve geçmediğinizi onayladınız mı 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
Yok ise .is_valid () yöntemi başarısız olmaz mı?
mp3por

11

İle toplu kullanıcı oluşturma set_password

Birkaç test kullanıcısı oluşturuyorsunuz bulk_create, çok daha hızlı, ancak onunla kullanamıyoruz create_user.

set_password Hashing uygulanmış parolaları oluşturmanın başka bir yoludur:

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

Parola hashing hakkında özel soru: Django'da parolaları şifrelemek için Bcrypt nasıl kullanılır?

Django 1.9'da test edilmiştir.


1
kabul edilenden çok daha iyi; Programlı olarak kullanıcı eklemeyi düşünüyorsanız, muhtemelen bir şeyi daha fazla kullanım için otomatikleştireceksiniz.
Sławomir Lenart

5

Kullanıcıyı normal şekilde yaratırsanız, şifre oluşturma yöntemi farklı olabileceğinden oturum açamazsınız Bunun için varsayılan kayıt formunu kullanabilirsiniz

from django.contrib.auth.forms import UserCreationForm

Bunu da uzatabilirsin

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

Sonra görünümde bu sınıfı kullanın

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
Forms.ModelForm'u genişleterek UserForm oluştururken bir hata olduğunu düşünüyorum. Bunun yerine UserCreationForm'u genişletmesi gerektiğini düşünüyorum
vladimir.gorea

Ayrıca, UserCreate sınıf görünümünün form_class'ı UserForm olmamalı mı?
vladimir.gorea
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.