Djangoでユーザーを作成するにはどうすればよいですか?


92

次のコードで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
どのような例外ですか?
セザール

2
@ user1364223例外トレースバック?
ジョセフビクター

User.objects.createが機能するはずだと思います。docs.djangoproject.com/en/1.4/ref/models/querysets/#create
iJK

回答:


189

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 2016

8
@ mp3por-はい。完全なドキュメントについては、ここに行くdocs.djangoproject.com/en/1.9/ref/contrib/auth/...
keithhackbarth

2
これをどのように/どこで実行しますか?私はちょうどそのコードを実行すると、私は得るdjango.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.この作品:EDITDJANGO_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(...
MarkChackerian19年

@keithhackbarthこのコードをdjangoファイル構造に挿入する必要があるファイルはどれですか?
ハンゴン

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 2016

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でパスワードを暗号化する方法

Django1.9でテスト済み。


1
受け入れられるよりもはるかに優れています。プログラムでユーザーを追加することを検討している場合は、おそらく、より多くの用途のために何かを自動化するでしょう。
ラヴォミールレナルト2016

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
forms.ModelFormを拡張してUserFormを作成するときに間違いがあると思います。私はそれが代わりにUserCreationFormを延長すべきだと思う
vladimir.gorea

また、UserCreateクラスビューのform_classはUserFormであるべきではありませんか?
vladimir.gorea 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.