Django PasswordResetView не работает для неактивных пользователей
У меня есть простое приложение на django, где пользователи могут создавать и входить в свои аккаунты.
Когда пользователь регистрирует новый аккаунт, объект user создается и сохраняется в базе данных с флагом is_active
, установленным в false. Как только пользователь нажимает кнопку подтверждения электронной почты, флаг is_active
объекта user устанавливается в true.
Я создал поток сброса пароля, используя представления Django: PasswordResetView
, PasswordResetDoneView
, PasswordResetConfirmView
и PasswordResetCompleteView
.
Все работает как ожидалось, если только я не пытаюсь сбросить пароль для учетной записи, которая еще не была активирована (is_active == False
), в этом случае письмо со сброшенным паролем никогда не отправляется пользователю.
Крайний случай, который я рассматриваю здесь - это пользователь, который создал учетную запись, но так и не нажал на ссылку регистрации, которая истекает через 72 часа, и таким образом у него есть учетная запись, которая существует, но не активна. Тогда пользователь хочет получить новую регистрационную ссылку, и для этого я требую, чтобы пользователь ввел свое имя пользователя и пароль (чтобы никакие злоумышленники не могли спамить почтовый ящик случайного пользователя письмами с новой регистрационной ссылкой). Если пользователь забыл свой пароль, он оказывается заблокированным и не может активировать свою учетную запись, а также обновить пароль.
Как отправить ссылку для сброса пароля на неактивные учетные записи?
пытались ли вы использовать django-allauth?
Думаю, это решает эту проблему. Django AllAuth - Как вручную отправить письмо со сброшенным паролем?
Я смог решить эту проблему, создав собственное дочернее приложение Django PasswordResetForm
и переопределив метод get_users
, который проверяет, если пользователь is_active
.
class ResetPasswordForm(PasswordResetForm):
# Override the get_users method and delete the requirement that a user is_active
# This is to account for the edge case where a user registered an account
# but never accepted the registration email, then they also forget their
# password, we need to be able to send a password reset link for a non active
# user.
def get_users(self, email):
"""Given an email, return matching user(s) who should receive a reset.
This allows subclasses to more easily customize the default policies
that prevent inactive users and users with unusable passwords from
resetting their password.
"""
email_field_name = UserModel.get_email_field_name()
active_users = UserModel._default_manager.filter(**{
'%s__iexact' % email_field_name: email
})
return (
u for u in active_users
if u.has_usable_password() and
_unicode_ci_compare(email, getattr(u, email_field_name))
)
Требование is_active
было первоначально представлено Джангосу PasswordResetForm
здесь .