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
あなたの回答
tips
プレビュー