Help us understand the problem. What is going on with this article?

犬ですが何か?Django--カスタムユーザーモデルを作成する2

追加情報の登録

こんにちは!柴犬のぽん太です。山でイノシシに追いかけられる夢を見ました。とても怖かったです。

さて、前回作成したカスタムユーザーモデルでは、dogname, introductionを追加したのですが、登録画面には下に示すように、その入力項目はありませんでした。

スクリーンショット 2020-08-30 20.46.29.png

ここにdognameとintroductionの入力項目を追加しましょう。

SignupFormのオーバーライド

入力フォームでdognameとintroductionが入力できるようにするために、SignupFormに追加します。

accounts/forms.py
rom 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としておき、

accounts/adapter.py
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を使用できるように設定します。

shiba_app/settings.py
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が入力できることを確認します。

スクリーンショット 2020-09-02 6.31.03.png

全ての項目を入力したらセーブし、管理画面に行って正しく入力されていることを確認します

スクリーンショット 2020-09-02 6.34.55.png

うまくいきました!じゃあまたね!バイバイ!

参考記事1:Djangoでdjango-allauthとCustomUserを使った認証機能を作成
参考記事2:Creating and Populating User instances

shibacorgi
柴犬のぽん太です!よろしくね!
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした