web-dev-qa-db-ja.com

Djangoでユーザーを登録する最良の方法

私はDjangoアプリにユーザー登録を実装しようとしています。読んだ本ではUserCreationFormに言及していますが、名前、パスワード、メールアドレス以外にも必要です。自分のユーザーオブジェクトを実装し、 ModelFormを使用しますが、認証のためのDjangoの便利さのいくつかを失います。最後に、私は推測するユーザーを補足するUserProfilesについて何かを読みました。ここに私がこれまでに持っているものがあります。

表示-これは非常に簡単です。ここでやりたいことは、フォームを作成してユーザーを保存することです

def main(request):
    rform1 = forms.RegisterForm1()
    rform2 = forms.RegisterForm2()
    return render_to_response("authentication/index.html", {'form1': rform1, 'form2':rform2})

def register(request):
    if request.method == 'POST':
        rform1 = forms.RegisterForm1(request.POST)
        rform2 = forms.RegisterForm2(request.POST)
        if rform1.is_valid() and rform2.is_valid():
            new_user = rform1.save()
            return HttpResponseRedirect("/register-success/")
    return render_to_response("authentication/index.html", {'form1': rform1,'form2':rform2})

フォーム-これはユーザーを作成するための私のフォームです。または少なくともそれの始まり

class RegisterForm1(forms.ModelForm):
    class Meta:
        model = User

class RegisterForm2(forms.ModelForm):
    class Meta:
        model = UserProfile

モデル-これは、ユーザーを補完するUserProfileです。

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    phonenumber = PhoneNumberField()

私がやろうとしていることは明らかですか?私は正しい軌道に乗っていますか

37
JPC

twoモデルフォームを作成します。1つはUserモデル用、もう1つはUserProfileモデル用です。

class UserForm(Django.forms.ModelForm):
    class Meta:
        model = User  

class UserProfileForm(Django.forms.ModelForm):
    class Meta:
        model = UserProfile
        exclude = ['user']

プレフィックスを付けて、同じHTMLフォーム要素に一緒に表示します。ビューで、Userを保存してからUserProfileを保存する前に、両方が有効であることを確認します。

def register(request):
    if request.method == 'POST':
        uf = UserForm(request.POST, prefix='user')
        upf = UserProfileForm(request.POST, prefix='userprofile')
        if uf.is_valid() * upf.is_valid():
            user = uf.save()
            userprofile = upf.save(commit=False)
            userprofile.user = user
            userprofile.save()
            return Django.http.HttpResponseRedirect(…something…)
    else:
        uf = UserForm(prefix='user')
        upf = UserProfileForm(prefix='userprofile')
    return Django.shortcuts.render_to_response('register.html', 
                                               dict(userform=uf,
                                                    userprofileform=upf),
                                               context_instance=Django.template.RequestContext(request))

register.html

<form method="POST" action="">
    {% csrf_token %}
    {{userform}}
    {{userprofileform}}
    <input type="submit">
</form>
31
Vebjorn Ljosa

私はこれを調べていたところ、Djangoには非常にシンプルな組み込みの新しいユーザー作成フォームがあり、簡単な登録が必要な場合に使用できます-たとえば、 、メールアドレスを保存して検証するため、OPのユースケースでは機能しませんが、他の人がこの質問に出くわした場合にここに投稿し、簡単なものを探しています。

ユーザーがユーザー名とパスワードを選択できるようにしたい場合は、ビルトインがすべてを行います。ユーザー:

from Django.views.generic.edit import CreateView
from Django.contrib.auth.forms import UserCreationForm

urlpatterns = patterns('',
    url('^register/', CreateView.as_view(
            template_name='register.html',
            form_class=UserCreationForm,
            success_url='/'
    )),
    url('^accounts/', include('Django.contrib.auth.urls')),

    # rest of your URLs as normal
)

自分でやらなければならないのはcreateregister.html...だけです。

詳細はこちら: http://www.obeythetestinggoat.com/using-the-built-in-views-and-forms-for-new-user-registration-in-Django.html

29
hwjp