You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django PasswordResetView无法给非活跃用户发送密码重置链接的解决方法

解决Django未激活账户无法接收密码重置邮件的问题

Django默认的PasswordResetView会自动过滤掉is_active=False的用户,导致未激活账户收不到密码重置邮件。要解决这个问题,只需自定义视图并重写对应的过滤逻辑:

1. 自定义密码重置视图

创建一个继承自PasswordResetView的自定义视图,重写get_users方法,移除对is_active状态的过滤:

from django.contrib.auth.views import PasswordResetView
from django.contrib.auth.models import User

class CustomPasswordResetView(PasswordResetView):
    def get_users(self, email):
        # 仅匹配邮箱,不排除未激活用户,同时保留可用密码检查
        matched_users = User.objects.filter(email__iexact=email)
        return (user for user in matched_users if user.has_usable_password())

默认的get_users方法会额外添加is_active=True的过滤条件,这里直接移除该条件,确保所有邮箱匹配且有可用密码的用户都能收到重置邮件。

2. 更新URL配置

在项目的urls.py中,将默认的密码重置视图替换为自定义视图:

from .views import CustomPasswordResetView

urlpatterns = [
    # 其他URL配置...
    path('password_reset/', CustomPasswordResetView.as_view(), name='password_reset'),
    # 密码重置流程的其他视图(PasswordResetDoneView等)保持不变
]

3. 处理密码重置后的账户激活(可选)

重置密码后账户仍处于未激活状态,可根据需求选择以下方案:

  • 自动激活账户:自定义PasswordResetConfirmView,在密码重置成功后自动激活账户:
from django.contrib.auth.views import PasswordResetConfirmView

class CustomPasswordResetConfirmView(PasswordResetConfirmView):
    def form_valid(self, form):
        response = super().form_valid(form)
        # 重置密码成功后激活账户
        self.user.is_active = True
        self.user.save()
        return response

同样在urls.py中替换对应的视图路径。

  • 引导用户重新获取激活链接:在密码重置完成页面(对应PasswordResetCompleteView的模板)添加提示,引导用户重新发送激活邮件:
<p>密码重置成功!请检查邮箱完成账户激活。</p>
<p>未收到激活邮件?<a href="{% url 'resend_activation' %}">点击重新发送</a></p>

resend_activation需自行实现,逻辑为根据用户输入的邮箱查找未激活用户,生成新的激活token并发送邮件。

内容的提问来源于stack exchange,提问作者redtomato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 09:01:45