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 здесь .

Вернуться на верх