質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.65%

CustomUserの更新ビューがうまく動作しない

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 200
退会済みユーザー

退会済みユーザー

UpdateViewを使用し、CustomUserの更新を行う際に次の事象が発生しております。
【事象内容】
・email更新後、更新前・更新後のemailでログインできてしまう

以下に詳細を記載いたします。
原因や回避策についてご教示いただけますと幸いです。
不足している点がありましたらその旨ご指摘ください。
よろしくお願いいたします。

使用パッケージ
・Python3.7
・Django2.2.2
・django-allauth 0.39.1

・models.py

class CustomUser(AbstractBaseUser, PermissionsMixin):
    username_validator = UnicodeUsernameValidator()

    username = models.CharField(
        _('username'),
        max_length=150,
        unique=True,
        help_text=_(
            'Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        validators=[username_validator],
        error_messages={
            'unique': _("A user with that username already exists."),
        },
    )
    uuid = models.UUIDField(_('uuid'), primary_key=True,
                            default=uuid.uuid4, editable=False)

    email = models.EmailField(_('email address'), unique=True, blank=True)

    is_staff = models.BooleanField(
        _('staff status'),
        default=False,
        help_text=_(
            'Designates whether the user can log into this admin site.'),
    )
    is_active = models.BooleanField(
        _('active'),
        default=True,
        help_text=_(
            'Designates whether this user should be treated as active. '
            'Unselect this instead of deleting accounts.'
        ),
    )
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)

    objects = CustomUserManager()

    #EMAIL_FIELD = 'email'
    USERNAME_FIELD = 'username' 
    REQUIRED_FIELDS = ['email'] 

また、認証ではusernameではなく、emailを使用するためsettings.pyで次の設定をしています。
・settings.py

AUTH_USER_MODEL = 'accounts.CustomUser'
ACCOUNT_USER_MODEL_EMAIL_FIELD = 'email'
ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_EMAIL_REQUIRED = True  # ユーザ登録時の必須項目とする
ACCOUNT_EMAIL_VERIFICATION = 'mandatory'
ACCOUNT_USERNAME_REQUIRED = True  # ユーザ登録時の必須項目とする
ACCOUNT_USER_MODEL_USERNAME_FIELD = 'username'
LOGIN_REDIRECT_URL = '/home'
ACCOUNT_SESSION_REMEMBER = False

ACCOUNT_LOGOUT_REDIRECT_URL = '/accounts/login/'
ACCOUNT_LOGOUT_ON_GET = True

SOCIALACCOUNT_EMAIL_VERIFICATION = ACCOUNT_EMAIL_VERIFICATION
SOCIALACCOUNT_EMAIL_REQUIRED = True
LOGIN_ON_EMAIL_CONFIRMATION = True
SOCIALACCOUNT_QUERY_EMAIL = False

上述の内容で、ユーザの認証機能はうまく動作しますが、
UpdateView・ModelFormを使用し、
CustomUserのusername・emailの更新を行う機能で
次の問題が発生しています。

・email更新後、更新前・更新後のemailでログインできてしまう
(username・emailともに更新できる)

UpdateViewおよびModelFormを以下に記載いたします。

・views.py

class CustomUserUpdateView(generic.UpdateView):
    model = get_user_model()
    form_class = CustomUserUpdateForm

    def form_valid(self, form):
        message = 'プロフィールを更新しました。'
        messages.info(self.request, message)
        return super().form_valid(form)

    def get_success_url(self):
        """
        更新に成功したら、更新後のプロファイルページに遷移させる。
        """
        return reverse('accounts:detail', kwargs={'pk': self.object.uuid})


・forms.py

class CustomUserUpdateForm(forms.ModelForm):

    class Meta:
        model = get_user_model()
        fields = ('username', 'email',)
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.65%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる