Django에서 사용자를 만드는 방법은 무엇입니까?


87

다음 코드로 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/en/1.4/ref/models/querysets/#create
iJK

답변:


181

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/en/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

3
현대 장고, 사용을위한 업데이트로 from django.contrib.auth import get_user_modeluser = get_user_model().objects.create_user(...
마크 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()))

암호 해싱에 대한 질문 : Django에서 Bcrypt를 사용하여 암호를 암호화하는 방법

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
form.ModelForm을 확장하여 UserForm을 만들 때 실수가 있다고 생각합니다. 내가 대신 UserCreationForm을 확장해야한다고 생각
vladimir.gorea

또한 UserCreate 클래스 뷰의 form_class가 UserForm이 아니어야합니까?
vladimir.gorea
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.