追加情報の登録
こんにちは!柴犬のぽん太です。山でイノシシに追いかけられる夢を見ました。とても怖かったです。
さて、前回作成したカスタムユーザーモデルでは、dogname, introductionを追加したのですが、登録画面には下に示すように、その入力項目はありませんでした。
ここにdognameとintroductionの入力項目を追加しましょう。
SignupFormのオーバーライド
入力フォームでdognameとintroductionが入力できるようにするために、SignupFormに追加します。
from allauth.account.forms import SignupForm
from django import forms
from .models import CustomUser
from django.utils.translation import gettext, gettext_lazy as _, pgettext
class CustomSignupForm(SignupForm):
dogname = forms.CharField(label=_("Dog Name"),
widget=forms.TextInput(
attrs={"placeholder": _('Dog Name')}
)
)
introduction = forms.CharField(label=_("Introduction"),
widget=forms.Textarea(
attrs={"placeholder": _('Introduction')}
))
class Meta:
model = CustomUser
def signup(self, user):
user.dogname = self.cleaned_data['dogname']
user.introduction = self.cleaned_data['introduction']
user.save()
return user
class UpdateProfileForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.user = kwargs.get('instance', None)
for field in self.fields.values():
field.widget.attrs['class'] = 'form-control'
class Meta:
model = CustomUser
fields = ('email', 'username', 'dogname', 'introduction')
DefaultAccountAdapterのオーバーライド
ユーザー情報を保存するためのDefaultAccountAdapterのメソッドsave_user()をオーバーライドします。ポイントは、save_userの引数commitをTrueとしておき、
from allauth.account.adapter import DefaultAccountAdapter
class AccountAdapter(DefaultAccountAdapter):
def save_user(self, request, user, form, commit=True):
"""
This is called when saving user via allauth registration.
we override this to set additional data on user object.
"""
user = super(AccountAdapter, self).save_user(request, user, form, commit=False)
user.dogname = form.cleaned_data.get('dogname')
user.introduction = form.cleaned_data.get('introduction')
user.save()
ACCOUNT_FORMS, ACCOUNT_ADAPTERの設定
CustomSignupFormとAccountAdapterを使用できるように設定します。
ACCOUNT_FORMS = {
'signup': 'accounts.forms.CustomSignupForm',
}
ACCOUNT_ADAPTER = 'accounts.adapter.AccountAdapter'
ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE = False
ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE = False
では、パスワードを一度だけ入力するようにしています。
表示テスト
http://127.0.0.1:8000/accounts/signup/
にアクセスし、Dog NameとIntroductionが入力できることを確認します。
全ての項目を入力したらセーブし、管理画面に行って正しく入力されていることを確認します
うまくいきました!じゃあまたね!バイバイ!
参考記事1:Djangoでdjango-allauthとCustomUserを使った認証機能を作成
参考記事2:Creating and Populating User instances