Làm cách nào để tạo người dùng trong Django?


87

Tôi đang cố tạo Người dùng mới trong dự án Django bằng mã sau, nhưng dòng được đánh dấu sẽ kích hoạt một ngoại lệ.

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

Bất kỳ giúp đỡ?


6
TẠI SAO loại ngoại lệ?
César

2
@ user1364223 Truy nguyên ngoại lệ?
Joseph Victor Zammit

Tôi nghĩ rằng User.objects.create sẽ hoạt động. docs.djangoproject.com/en/1.4/ref/models/querysets/#create
iJK

Câu trả lời:


182

Cách chính xác để tạo người dùng trong Django là sử dụng hàm create_user. Điều này sẽ xử lý việc băm mật khẩu, v.v.

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

này sẽ băm mật khẩu?
mp3por 10/02/16

8
@ mp3por - Có. Để có tài liệu đầy đủ, hãy truy cập tại đây docs.djangoproject.com/en/1.9/ref/contrib/auth/…
keithhackbarth 10/02/16

2
làm thế nào / ở đâu để tôi chạy cái này? Nếu tôi chỉ chạy mã đó, tôi nhận được django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.CHỈNH SỬA: điều này hoạt độngDJANGO_SETTINGS_MODULE=app.settings.dev python manage.py shell < register-user.py
citynorman

3
Là một bản cập nhật cho Django hiện đại hơn, hãy sử dụng from django.contrib.auth import get_user_modeluser = get_user_model().objects.create_user(...
Mark Chackerian

@keithhackbarth Tôi nên chèn mã này vào tệp nào trong cấu trúc tệp django?
Hangon

23

Bạn đã xác nhận rằng bạn đang truyền các giá trị thực tế hay chưa 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
Nếu chúng là Không thì phương thức .is_valid () sẽ không thành công?
mp3por 10/02/16

11

Tạo hàng loạt người dùng với set_password

Tôi bạn đang tạo một số người dùng thử nghiệm, bulk_createnhanh hơn nhiều, nhưng chúng tôi không thể sử dụng create_uservới nó.

set_password là một cách khác để tạo mật khẩu được băm:

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

Câu hỏi cụ thể về băm mật khẩu: Cách sử dụng Bcrypt để mã hóa mật khẩu trong Django

Đã thử nghiệm trong Django 1.9.


1
tốt hơn nhiều so với chấp nhận; nếu bạn đang xem xét thêm người dùng theo chương trình, bạn có thể tự động hóa một cái gì đó để sử dụng nhiều hơn.
Sławomir Lenart

5

Nếu bạn tạo người dùng bình thường, bạn sẽ không thể đăng nhập vì phương pháp tạo mật khẩu có thể khác Bạn có thể sử dụng biểu mẫu đăng ký mặc định cho điều đó

from django.contrib.auth.forms import UserCreationForm

Bạn cũng có thể mở rộng điều đó

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

Sau đó, trong chế độ xem, hãy sử dụng lớp này

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
Tôi nghĩ rằng có một sai lầm khi tạo UserForm bằng cách mở rộng các biểu mẫu.ModelForm. Tôi nghĩ nó nên mở rộng UserCreationForm để thay thế
vladimir.gorea

Ngoài ra, form_class của chế độ xem lớp UserCreate không phải là UserForm?
vladimir.gorea
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.