首页 > 解决方案 > 如果过期,PasswordResetConfirmView 的 PASSWORD_RESET_TIMEOUT 消息

问题描述

美好的一天。

如果 PASSWORD_RESET_TIMEOUT 已过期,如何添加消息?我正在使用 django.contrib.auth PasswordResetView 获取带有密码重置令牌的 url 链接。基于docs,我可以像这样添加 PASSWORD_RESET_TIMEOUT :

PASSWORD_RESET_TIMEOUT = 10

10秒只是为了测试。

10 秒后,我尝试刷新页面,用户仍然可以使用 URL 访问,PasswordResetConfirmView但不能再更改密码。即使使用不匹配的密码,也没有响应。我应该如何处理这个?

作为参考,这是我的网址:

path('reset_password/', views.MyPasswordResetView.as_view(
    template_name="../templates/logauth/reset_password.html",
    subject_template_name='../templates/logauth/password_reset_subject.txt',
    email_template_name='../templates/logauth/password_reset_email.html',
    html_email_template_name='../templates/logauth/password_reset_email.html',
    from_email=settings.EMAIL_HOST_USER,), 
    name="reset_password"),
path('reset_password_sent/', auth_views.PasswordResetDoneView.as_view(template_name="../templates/logauth/reset_password_sent.html"), name="password_reset_done"),
path('reset/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(template_name="../templates/logauth/reset_password_2.html"), name="password_reset_confirm"),
path('reset_password_complete/', auth_views.PasswordResetCompleteView.as_view(template_name="../templates/logauth/reset_password_complete.html"), name="password_reset_complete"),

更改我的 PasswordResetView 的表单:

class MyPasswordResetForm(PasswordResetForm):
    username = forms.CharField(max_length=254)
    field_order = ['username', 'email']

    def __init__(self, *args, **kwargs):
        super(MyPasswordResetForm, self).__init__(*args, **kwargs)
        for field in self.fields:
            self.fields[field].widget.attrs = {'class': 'user-input-form'}

看法:

class MyPasswordResetView(PasswordResetView):
    form_class = MyPasswordResetForm

    def form_valid(self, form):

        username = form.cleaned_data.get('username')
        email = form.cleaned_data.get('email', '').lower()
        try:
            user = get_user_model().objects.get(username=username, email=email)
        except(get_user_model().DoesNotExist):
            user = None
        if user is None:
            return redirect('password_reset_done')
        return super().form_valid(form)

标签: django

解决方案


Django 在PasswordResetConfirmView类中提供了一个模板上下文:validlink--> 它是一个Boolean ,如果链接(uidb64token的组合)有效或尚未使用,则返回True 。

文档:https ://docs.djangoproject.com/en/3.2/topics/auth/default/#django.contrib.auth.views.PasswordResetConfirmView

password_reset_confirm.html您可以使用它来执行模板内部的逻辑,如下所示:

{% if validlink %}

 <div class="content-section">
  <form method="POST">
    {% csrf_token %}
    <fieldset class="form-group">
      <legend class="border-bottom mb-4">Change Password</legend>
      {{ form }}
    </fieldset>
    <div class="form-group">
      <button class="btn btn-outline-info" type="submit">Change password</button>
    </div>
  </form>
 </div>

{% else %}

 <div class="alert alert-info mt-2">
   The link you follewd has expired! To login or reset password again click 
   <a href="{% url 'login' %}">here</a>
 </div>

{% endif %}

推荐阅读