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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Authentication

Authentication(認証)は正当性を認証する為の工程です。ログイン処理等で使われます。

Q&A

0回答

1220閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Authentication

Authentication(認証)は正当性を認証する為の工程です。ログイン処理等で使われます。

0グッド

0クリップ

投稿2019/07/08 04:39

編集2019/07/08 04:51

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

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

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

・models.py

python

1class CustomUser(AbstractBaseUser, PermissionsMixin): 2 username_validator = UnicodeUsernameValidator() 3 4 username = models.CharField( 5 _('username'), 6 max_length=150, 7 unique=True, 8 help_text=_( 9 'Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'), 10 validators=[username_validator], 11 error_messages={ 12 'unique': _("A user with that username already exists."), 13 }, 14 ) 15 uuid = models.UUIDField(_('uuid'), primary_key=True, 16 default=uuid.uuid4, editable=False) 17 18 email = models.EmailField(_('email address'), unique=True, blank=True) 19 20 is_staff = models.BooleanField( 21 _('staff status'), 22 default=False, 23 help_text=_( 24 'Designates whether the user can log into this admin site.'), 25 ) 26 is_active = models.BooleanField( 27 _('active'), 28 default=True, 29 help_text=_( 30 'Designates whether this user should be treated as active. ' 31 'Unselect this instead of deleting accounts.' 32 ), 33 ) 34 date_joined = models.DateTimeField(_('date joined'), default=timezone.now) 35 36 objects = CustomUserManager() 37 38 #EMAIL_FIELD = 'email' 39 USERNAME_FIELD = 'username' 40 REQUIRED_FIELDS = ['email']

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

python

1AUTH_USER_MODEL = 'accounts.CustomUser' 2ACCOUNT_USER_MODEL_EMAIL_FIELD = 'email' 3ACCOUNT_AUTHENTICATION_METHOD = 'email' 4ACCOUNT_EMAIL_REQUIRED = True # ユーザ登録時の必須項目とする 5ACCOUNT_EMAIL_VERIFICATION = 'mandatory' 6ACCOUNT_USERNAME_REQUIRED = True # ユーザ登録時の必須項目とする 7ACCOUNT_USER_MODEL_USERNAME_FIELD = 'username' 8LOGIN_REDIRECT_URL = '/home' 9ACCOUNT_SESSION_REMEMBER = False 10 11ACCOUNT_LOGOUT_REDIRECT_URL = '/accounts/login/' 12ACCOUNT_LOGOUT_ON_GET = True 13 14SOCIALACCOUNT_EMAIL_VERIFICATION = ACCOUNT_EMAIL_VERIFICATION 15SOCIALACCOUNT_EMAIL_REQUIRED = True 16LOGIN_ON_EMAIL_CONFIRMATION = True 17SOCIALACCOUNT_QUERY_EMAIL = False

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

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

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

・views.py

python

1class CustomUserUpdateView(generic.UpdateView): 2 model = get_user_model() 3 form_class = CustomUserUpdateForm 4 5 def form_valid(self, form): 6 message = 'プロフィールを更新しました。' 7 messages.info(self.request, message) 8 return super().form_valid(form) 9 10 def get_success_url(self): 11 """ 12 更新に成功したら、更新後のプロファイルページに遷移させる。 13 """ 14 return reverse('accounts:detail', kwargs={'pk': self.object.uuid})

・forms.py

python

1class CustomUserUpdateForm(forms.ModelForm): 2 3 class Meta: 4 model = get_user_model() 5 fields = ('username', 'email',) 6

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問