2012-04-29 59 views
34

Tôi đang cố gắng 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ệ.Làm cách nào để tạo người dùng ở 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)) 

Mọi trợ giúp?

+4

Loại ngoại lệ nào? –

+2

@ user1364223 Traceback ngoại lệ? –

+0

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

Trả lời

90

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ý băm của mật khẩu, vv ..

from django.contrib.auth.models import User 
user = User.objects.create_user(username='john', 
           email='[email protected]', 
           password='glass onion') 
+0

sẽ băm mật khẩu này? – mp3por

+3

@ mp3por - Có. Để biết tài liệu đầy đủ, hãy truy cập tại đây https://docs.djangoproject.com/en/1.9/ref/contrib/auth/#django.contrib.auth.models.UserManager.create_user – keithhackbarth

+0

Tôi/nơi nào để chạy? Nếu tôi chỉ chạy mã đó tôi nhận được 'django.core.exceptions.AppRegistryNotReady: Ứng dụng chưa được tải.' EDIT: hoạt động này' DJANGO_SETTINGS_MODULE = app.settings.dev python manage.py shell citynorman

18

Bạn đã xác nhận rằng bạn đang chuyển các giá trị thực tế chứ không phải là 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à None thì phương thức .is_valid() không thành công? – mp3por

6

Bulk tạo người dùng với set_password

tôi bạn đang tạo nhiều người dùng kiểm tra, bulk_create là nhanh hơn nhiều, nhưng chúng tôi không thể sử dụng create_user với nó.

set_password là một cách khác để tạo ra mật khẩu 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: How to use Bcrypt to encrypt passwords in Django

Tested trong Django 1.9.

+1

tốt hơn nhiều so với chấp nhận; nếu bạn đang cân nhắc việc 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. –

2

Nếu bạn creat người dùng bình thường, bạn sẽ không thể đăng nhập như là phương pháp tạo mật khẩu có thể b khác nhau Bạn có thể sử dụng hình thức đăng ký mặc định cho rằng

from django.contrib.auth.forms import UserCreationForm 

Bạn có thể mở rộng mà cũng

from django.contrib.auth.forms import UserCreationForm 

class UserForm(forms.ModelForm): 
    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 sử dụng lớp này

class UserCreate(CreateView): 
    form_class = SignUpForm 
    template_name = 'registration/signup.html' 
    success_url = reverse_lazy('list') 

    def form_valid(self, form): 
     user = form.save() 
+0

Tôi nghĩ rằng có một sai lầm khi tạo UserForm bằng cách mở rộng biểu mẫu.ModelForm. Tôi nghĩ rằng nó nên mở rộng UserCreationForm thay vì –

+0

Ngoài ra, không nên form_class của lớp UserCreate xem được UserForm? –

Các vấn đề liên quan