嗯,我需要创建一个基于 Django 的 PasswordReset 视图的自定义视图,但是当用户已经登录时。我最初使用 PasswordChangeView 来实现此目的,但它会自动将用户重定向到 PasswordChangeForm,用户在其中输入旧密码并新密码,然后保存。但是,出于安全考虑,我被要求,当用户单击链接更改密码时,它会自动向他们发送密码重置电子邮件,显示“password_reset_done.html”并发送密码重置密码。 (不知道我是否清楚地表明我目前正在学习,这是我第一次使用堆栈溢出。
我已经有一个使用PasswordResetView的custom_password_change视图。
`def custom_password_change(request):
if request.method == "POST":
user = request.user
if user.is_authenticated:
# Call the Django built-in view for password reset
return PasswordResetView.as_view(
template_name='registration/password_change_form.html',
email_template_name='registration/password_change_email.html',
success_url='/password_change/done/'
)(request)
return render(request, "registration/password_change_form.html")`
但它仍然要求用户在PasswordResetForm上输入电子邮件,然后发送电子邮件。当用户单击“更改密码”并返回“password_reset_done.html”模板时,我需要它来发送电子邮件。
您需要实现两个视图。 第一个视图请求电子邮件并实施发布请求以发送重置密码电子邮件。即
class PasswordRequestView(View):
template_name = "request_password_change.html"
email_sent_template = 'email_sent_template.html'
def get(self, request, *args, **kwargs):
# rendering the request password form
return render(request, self.template_name)
def post(self, request, *args, **kwargs):
data = request.POST.dict()
email = data.get('email', None)
print('email => ', email)
# send the generated url to this email
# i.e http://localhost:6065/password-change/<access_key>/
generated_url = "http://0.0.0.0:6005/password-change/wJalrXUtnFEMIK7MDENGbPxRfiCYEXAMPLEKEY/"
# you can send this url via email. the user will click on this url to reset pass.
return render(request, self.email_sent_template, {"access_url": generated_url})
第二个视图捕获共享 URL(通过电子邮件)并发布重置密码的请求。即
class PasswordChangeView(View):
template_name = "password_change_form.html"
password_reset_success = 'password_reset_template.html'
def get(self, request, *args, **kwargs):
access_key = kwargs.get('access_key', '')
print('access key => ', access_key)
# do more validations here and return reset password form
return render(request, self.template_name)
def post(self, request, *args, **kwargs):
data = request.POST.dict()
print(data)
# reset password here
return render(request, self.password_reset_success)
注意:这种情况下的网址将是这样的。
urlpatterns = [
path('request-password-change/', views.PasswordRequestView.as_view(),
name='request-pass-change'),
path('password-change/<str:access_key>/',
views.PasswordChangeView.as_view(), name='pass-change'),
]