見出し画像

Django ユーザー登録ををカスタマイズ

前提

Djangoはインストール済み
Django-allautuもインストール済み

読み替えが必要な個所

App = accountでアプリを作成しそこに関連ファイルを入れている
accountのところは自分の作成したappに置き換えること

完成コード

settings.py

画像1


AUTH_USER_MODEL = 'accounts.CustomUser'
ACCOUNT_FORMS = {
  'signup' : 'accounts.forms.CustomSignupForm',
  # 同じやり方でlogin時のformを編集可能
  #'login': 'accounts.forms.LoginForm',

} 
#CustomSignupFormの情報をDBに受け渡すときにはadapterを間に入れないとダメ
ACCOUNT_ADAPTER = 'accounts.adapter.AccountAdapter'


models.py

画像3

class CustomUser(AbstractUser):
   user_rank = models.IntegerField('ランク', blank=True, default=3)


adapter.py

画像2


class AccountAdapter(DefaultAccountAdapter):

   def save_user(self, request, user, form, commit=True):
       """
       Saves a new `User` instance using information provided in the
       signup form.
       """
       from allauth.account.utils import user_username, user_email, user_field

       data = form.cleaned_data
       first_name = data.get('first_name')
       last_name = data.get('last_name')
       email = data.get('email')
       username = data.get('username')
       user_email(user, email)
       user_username(user, username)
       if first_name:
           user_field(user, 'first_name', first_name)
       if last_name:
           user_field(user, 'last_name', last_name)
       if 'password1' in data:
           user.set_password(data["password1"])
       else:
           user.set_unusable_password()
       self.populate_username(request, user)

       user.user_rank = form.cleaned_data.get('user_rank') #追加

       if commit:
           # Ability not to commit makes it easier to derive from
           # this adapter by adding
           user.save()
       return user


forms.py


class CustomSignupForm(SignupForm):
   user_rank = IntegerField();

   class Meta:
       model = CustomUser

   def save(self, request):
       adapter = get_adapter(request)
       user = adapter.new_user(request)

       user.user_rank = self.cleaned_data['user_rank'] #ここに情報を追加してみる

       adapter.save_user(request, user, self)
       self.custom_signup(request, user)
       # TODO: Move into adapter `save_user` ?
       setup_user_email(request, user, [])
       return user


多分adapter.pyを変えなくても動くと思います

adapter.pyは多分修正なしでも大丈夫

参考にしたサイトではDBに反映されないというので取り入れたのですが、adapter.pyの追加部分をコメントアウトしてもしっかり入力値が反映されていたので・・・

最初forms.pyとどっちか片方でもいいかと思ったのですが
一番上のuser_rank = IntegerField();の追加カラムをクラス変数に入れている場所は替えが聞かなかったので(入力formが消える)
ただ入力値を保存している場所に関してはadaputer.pyを変えれば一番上のカラム追加だけでも反映を確認しました

ひょっとしたらversion関係で修正されたかもしれないのでわからなければ両方入れておいてください

それぞれの追加部分について

settings.py

AUTH_USER_MODEL
ユーザーの認証につかうモデルを指定します(今回は作成したCustomUserを指定しています)

ACCOUNT_FORMS
デフォルトから変更するformを指定してカスタムフォームを指定する(ここで指定しないものはデフォルトを使用する)

ACCOUNT_ADAPTER
アカウント系列から参照される関数セット(だと思う)の指定
その役割を仮定するなら
formにはフィールド指定
adapterにはDB登録時の標準処理を記載するのが正しいと思う

models.py

カスタムユーザーの設定

user_rank = models.IntegerField('ランク', blank=True, default=3)
カラムの追加user_rankというカラムをBD上に生成させるように指定

全体な機能

AbstractUserを継承してただ追加カラムを置いている
カラムの追加だけならこれだけでおk
標準で必要(そうな)機能はAbstractUserに実装されているのでpassだけで指定しても使える。
あとから機能追加するといったのことも楽なのでpassだけでいいのでとりあえず作って切り替えておくべき
もっと複雑なことがやりたいならAbstractBaseUserの継承で1から作る必要があるこちらだとUSERNAME自体を消し去るみたいなこともできる
でも知識は結構必要


adapter.py

ごちゃごちゃ書いてあるけれど継承元のDefaultAccountAdapterコピペしたもの
user.user_rank = form.cleaned_data.get('user_rank') だけを付け加えた

Djangoは追加するひとのことをそうていしているので
スーパークラスを呼んでsave_userの引数にcommit=Falseをつけるだけでデータ送信しないクエリセットが完成しているので
あとは情報をつけて.saveすればここ尾までコピペする必要は恐らくない
というか公式に記載されていたのは多分commitFalseをつける方法


forms.py
基本的にはsettings.pyで上書きするformを継承して作成する

今回の場合はSignupFormを継承して必要なメゾットはすべてそろっている状態から開始
user_rank = IntegerField();
クラス変数に追加するフィールドを入れること
これがないと入力fromがテンプレートに反映されない

def save(self, request):

これをOverrideすることでDB登録メゾットを上書きできる
これも継承したスーパークラスのメゾットまんまに情報をつけ足しだけ

adapterをよんでそこからユーザー登録情報とかを引っ張ってuserに格納しているので呼ばれたUserに情報を加算してもAdaputerで追加しても同様に登録処理されるはず






この記事が気に入ったらサポートをしてみませんか?