จะสร้างผู้ใช้ใน Django ได้อย่างไร?


91

ฉันกำลังพยายามสร้างผู้ใช้ใหม่ในโครงการ Django โดยใช้รหัสต่อไปนี้ แต่บรรทัดที่ไฮไลต์ทำให้เกิดข้อยกเว้น

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

ความช่วยเหลือใด ๆ


6
ข้อยกเว้นประเภทใด
César

2
@ user1364223 การย้อนกลับข้อยกเว้น?
Joseph Victor Zammit

ฉันคิดว่า User.objects.create ควรใช้งานได้ docs.djangoproject.com/th/1.4/ref/models/querysets/#create
iJK

คำตอบ:


188

วิธีที่ถูกต้องในการสร้างผู้ใช้ใน Django คือการใช้ฟังก์ชัน create_user สิ่งนี้จะจัดการกับการแฮชรหัสผ่าน ฯลฯ ..

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

จะแฮชรหัสผ่านไหม
mp3por

8
@ mp3por - ใช่ ดูเอกสารฉบับเต็มได้ที่นี่docs.djangoproject.com/th/1.9/ref/contrib/auth/…
keithhackbarth

2
ฉันจะรันสิ่งนี้ได้อย่างไร / ที่ไหน ถ้าฉันแค่เรียกใช้รหัสนั้นฉันจะได้รับการdjango.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.แก้ไข: มันใช้งานได้DJANGO_SETTINGS_MODULE=app.settings.dev python manage.py shell < register-user.py
citynorman

4
สำหรับการอัปเดต Django ที่ทันสมัยมากขึ้นให้ใช้from django.contrib.auth import get_user_modelและuser = get_user_model().objects.create_user(...
Mark Chackerian

@keithhackbarth ฉันควรแทรกโค้ดนี้ในโครงสร้างไฟล์ django ในไฟล์ใด
Hangon

23

คุณยืนยันหรือไม่ว่าคุณกำลังส่งผ่านค่าจริง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
หากพวกเขาเป็น None จะไม่ทำให้เมธอด. is_valid () ล้มเหลว?
mp3por

11

การสร้างผู้ใช้จำนวนมากด้วยไฟล์ set_password

ฉันกำลังสร้างผู้ใช้ทดสอบหลายคนbulk_createเร็วกว่ามาก แต่เราใช้create_userกับมันไม่ได้

set_password เป็นอีกวิธีหนึ่งในการสร้างรหัสผ่านที่แฮช:

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

คำถามเฉพาะเกี่ยวกับการแฮชรหัสผ่าน: วิธีใช้ Bcrypt เพื่อเข้ารหัสรหัสผ่านใน Django

ทดสอบใน Django 1.9


1
ดีกว่าที่ยอมรับมาก หากคุณกำลังพิจารณาเพิ่มผู้ใช้โดยใช้โปรแกรมคุณอาจจะทำบางอย่างโดยอัตโนมัติเพื่อการใช้งานที่มากขึ้น
Sławomir Lenart

5

หากคุณสร้างผู้ใช้ตามปกติคุณจะไม่สามารถเข้าสู่ระบบได้เนื่องจากวิธีการสร้างรหัสผ่านอาจแตกต่างออกไปคุณสามารถใช้แบบฟอร์มการสมัครเริ่มต้นสำหรับสิ่งนั้น

from django.contrib.auth.forms import UserCreationForm

คุณสามารถขยายได้เช่นกัน

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

จากนั้นให้ใช้คลาสนี้ในมุมมอง

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
ฉันคิดว่ามีข้อผิดพลาดเมื่อสร้าง UserForm โดยการขยายแบบฟอร์ม ModelForm ฉันคิดว่าควรขยาย UserCreationForm แทน
vladimir.gorea

นอกจากนี้ form_class ของมุมมองคลาส UserCreate ควรเป็น UserForm หรือไม่
vladimir.gorea
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.