アカウント未検証のユーザがパスワードリセットを実行したときには,未検証であることを理由にメールの送信は行われません.しかしながら,ユーザには「メールを送信しました」という表示が出てしまうバグがあるので,このバグを修正しよう.
users/views.py
class PasswordResetView(PasswordContextMixin, FormView):
email_template_name = "users/password_reset_email.html"
extra_email_context = None
form_class = PasswordResetForm
from_email = settings.EMAIL_FROM
html_email_template_name = None
subject_template_name = "users/password_reset_subject.txt"
success_url = reverse_lazy("users:password_reset_done")
template_name = "users/password_reset_form.html"
title = _("Password reset")
token_generator = default_token_generator
@method_decorator(csrf_protect)
def dispatch(self, *args, **kwargs):
return super().dispatch(*args, **kwargs)
def form_valid(self, form):
# メールアドレスのチェック:登録されていないアドレスには送信しない
users = UserModel.objects.filter(email=form.cleaned_data['email'])
if len(users) == 0:
messages.success(self.request, '登録されていないメールアドレスです')
return redirect(reverse('index'))
if not users[0].is_active:
messages.success(self.request, 'メールアドレスの検証が終わっていません')
messages.success(self.request, '受け取ったメールを確認してください')
messages.success(self.request, 'あるいはこのページからメールを再送信してください')
return redirect(reverse('users:create_resend'))
messages.success(self.request, 'メールを送信しました')
opts = {
"use_https": self.request.is_secure(),
"token_generator": self.token_generator,
"from_email": self.from_email,
"email_template_name": self.email_template_name,
"subject_template_name": self.subject_template_name,
"request": self.request,
"html_email_template_name": self.html_email_template_name,
"extra_email_context": self.extra_email_context,
}
form.save(**opts)
return super().form_valid(form)
未検証ユーザがパスワードリセットを行おうとするとエラーが表示され,メール再送信のページにリダイレクトされることが確認できました.