Ошибка "Страница не найдена" при попытке сбросить пароль в Django3
Здесь я использую Python 3.7 и Django 3.0 Где когда пользователь нажимает на кнопку забыл пароль, пользователю отправляется письмо со ссылкой для сброса пароля, когда пользователь нажимает на эту ссылку, я получаю ошибку page not found
Вот мой views.py
.....
......
associated_users= ClientUser.objects.filter(email= data)
if associated_users.exists():
for user in associated_users:
c = {
'email': user.email,
'domain': request.META['HTTP_HOST'],
'site_name': 'your site',
'uid': urlsafe_b64encode(force_bytes(user.pk)),
'user': user.name,
'token': default_token_generator.make_token(user),
'protocol': 'http',
}
self.request.session['e_data'] = {
'email': user.email,
}
subject_template_name='core/reset_subject.txt'
# copied from django/contrib/admin/templates/registration/password_reset_subject.txt to templates directory
email_template_name='core/reset_email.html'
# copied from django/contrib/admin/templates/registration/password_reset_email.html to templates directory
subject = loader.render_to_string(subject_template_name, c)
# Email subject *must not* contain newlines
subject = ''.join(subject.splitlines())
email = loader.render_to_string(email_template_name, c)
send_mail(subject, email, settings.DEFAULT_FROM_EMAIL , [user.email], fail_silently=False)
result = self.form_valid(form)
messages.success(request, 'An email has been sent to ' + data +". Please check its inbox to continue reseting password.")
return result
result = self.form_invalid(form)
messages.error(request, 'No user is associated with this email address')
return result
вот мой reset_email.html
{% load i18n %}{% autoescape off %}
{% trans "There has been a request to reset your password for Degree. To reset your password use this link:" %}
{% block reset_link %}
"{%if secure %}https{% else %}http{% endif %}://{{domain}}/reset_password_confirm/{{uidb64}}{{uid}}-{{token}}"
{% endblock %}
{% trans "If you did not make a request to reset your password please notify us by sending an email to support@degree.com" %}
{% trans "Best regards," %}
{% trans "Degree Support" %}
{% endautoescape %}
Вот мой urls.py для reset_password_confirm
re_path(r'^reset_password_confirm/(?P<uidb64>[0-9A-Za-z=]+)/(?P<token>.+)/$', PasswordResetConfirmView.as_view(),name='reset_password_confirm'),
вот мое изображение ошибки
В соответствии с вашим определением пути
{%if secure %}https{% else %}http{% endif %}://{{domain}}/reset_password_confirm/{{uidb64}}{{uid}}-{{token}}"
должен быть
{%if secure %}https{% else %}http{% endif %}://{{domain}}/reset_password_confirm/{{uidb64}}{{uid}}/{{token}}"
Заметка {{uid}}-{{token}}
изменена на {{uid}}/{{token}}
.
Вторая ошибка, которую я вижу, заключается в том, что вам нужно кодировать ваш uidb64
в utf-8
или какую-то другую кодировку, потому что сейчас он находится в виде байтов.
На ваш взгляд, вы можете сделать:
uidb64 = uidb64.encode('utf-8')