diadia

趣味のプログラムを書く 

ユーザ登録(sign up)機能を作る

どうやってユーザを作成するか。
とりあえず作り方のアプローチとしては2通りある。
djangoビルトインのUserCreationFormを使う方法
Djangoの認証システムを使用する | Django documentation | Django

forms.pyから作成する方法(自作)



今回は自作する方法をメモする。


Djangoの認証システムを使用する | Django documentation | Django
この辺が必要になる。

views.pyにて

User = get_user_model()

def register_page():
    form = RegisterForm(request.POST)
    context = {"forms":form}
    
    if form.is_valid():
        print(form.cleaned_data)
        username = form.cleaned_data.get("username")
        email = form.cleaned_data.get("email")
        password = form.cleaned_data.get("password")
    new_user = User.objects.create_user(username, email,password )
    render(request, "register_page.html", context)

get_user_model()は使うことが推奨されている。

forms.py

from django import forms

class RegisterForm(foms.Form): 
    username = forms.CharField()
    email = forms.CharField()
    password = forms.CharField(widget=forms.PasswordInput)    
    password2=forms.CharField(
              label="ConfirmPassword",
              widget=forms.PasswordInput
                )
#フォームには入力ミス(バリデーションエラー)を表示させる機能を書く
#入力ミスの種類には、2箇所のパスワード入力値が不一致の場合に知らせるもの、すでに登録されているusername,emailの場合登録できないと知らせるものがある。

#password 不一致のバリデーション
    def match_password(self):
        data = self.cleaned_data.
        password = data.get("password")
        password2 = data.get("password2")
        if password != password2 :
            raise ValidationError("password must be same" )
        return data

#既登録の入力値エラー
    def double_email(self):
        email = self.cleaned_data.get("email")
        query_set = User.objects.filter(email=email)
        if email = query_set:
            return ValidationError("this e-mail is taken")
        return email

    def double_email(self):
        username = self.cleaned_data.get("username")
        query_set = User.objects.filter(username=username)
        if username = query_set:
            return ValidationError("this username is taken")
        return username

簡単にまとめると、登録機能はviews.pyが担っている。一方、forms.pyは入力内容を決めている。また入力値が適正かの判断もforms.pyが担っている。
登録機能の要views.pyについて少し書く。
create_user()で登録させる。引数はusername,email,passwordにした。
new_user = User.objects.create_user(username, email, password) のUserについては予め定義しておく。
User = get_user_model() これをしておかないと、djangoの既設定Userをつかってしまうからっぽい。username, email, passwordはいつもどおりに取り出す。(POSTの値をcleaned_dataして辞書型のデータに整形し、get()にキーを入力して取り出すって流れ。)