django - 如果过期,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 在PasswordResetConfirmView
类中提供了一个模板上下文:validlink
--> 它是一个Boolean ,如果链接(uidb64和token的组合)有效或尚未使用,则返回True 。
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 %}
推荐阅读
- python - “import sys import argv”出现问题
- android - 致命异常:org.apache.commons.lang3.tuple.Pair 的 java.lang.NoSuchMethodError
- javascript - (新手程序员) mod(3^146, 293) 在 Matlab 和 JS 中返回相同的错误值
- amazon-web-services - EMR集群如何删除
- c++ - 使用 SFML 生成和播放正弦波时出现静电和嗡嗡声
- java - 如何显示进度条?多线程java
- unity3d - 何时以及为什么不应该使用预制变体?
- c++-cx - C ++中事件的目的是什么?
- erlang - 创建仅二进制的 Erlang 版本
- c# - ScreenPointtoRay 为鼠标跟随脚本创建问题