Вот еще одно решение, использующее path
вместо устаревшего url
, для создания пользовательской версии страницы и формы для сброса пароля после перехода по ссылке, отправленной по электронной почте. Я использую Django 2 и Python 3.
В папке приложения api я создал папку templates / account с тремя файлами внутри.
base.html:
<!DOCTYPE html>
<html>
<head>
<title>{% block head_title %}{% endblock %}</title>
{% block extra_head %}
{% endblock %}
</head>
<body>
{% block body %}
{% block content %}
{% endblock %}
{% endblock %}
{% block extra_body %}
{% endblock %}
</body>
</html>
password_reset_complete.html:
{% extends "account/base.html" %}
{% block content %}
<h3>Password reset successful</h3>
<p>Your password has been changed. Please log in using the link below.</p>
<p><a href="/login/">Login</a></p>
{% endblock %}
password_reset_confirm.html:
{% extends 'account/base.html' %}
{% block content %}
{% if validlink %}
<h3>Enter your new password</h3>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Change password</button>
</form>
{% else %}
<p>
The password reset link was invalid, possibly because it has already been used.
Please request a new password reset.
</p>
{% endif %}
{% endblock %}
В моей папке приложения API я создал файл forms.py для своей пользовательской формы, который расширяет стандартную форму SetPasswordForm.
forms.py:
from django import forms
from django.contrib.auth.forms import SetPasswordForm
from django.utils.translation import gettext, gettext_lazy as _
from django.contrib.auth import password_validation
class SetPasswordFormCustom(SetPasswordForm):
new_password1 = forms.CharField(
label=_("New password custom"),
widget=forms.PasswordInput,
strip=False,
)
new_password2 = forms.CharField(
label=_("New password confirmation custom"),
strip=False,
widget=forms.PasswordInput,
help_text=password_validation.password_validators_help_text_html(),
)
И, наконец, urls.py:
# api/urls.py
from django.urls import include, path
from django.contrib.auth import views
from django.conf.urls import include, url
from django.views.generic.base import RedirectView
from .forms import SetPasswordFormCustom
urlpatterns = [
...
path('reset/<uidb64>/<token>/',
views.PasswordResetConfirmView.as_view(template_name='account/password_reset_confirm.html',
form_class=SetPasswordFormCustom),
name='password_reset_confirm'),
path('reset/done/', views.PasswordResetCompleteView.as_view(template_name='account/password_reset_complete.html'), name='password_reset_complete'),
]
Примечание 'из .forms import SetPasswordFormCustom'. . позволяет импортировать файл из той же папки.
Моя причина для всего этого состоит в том, что у меня нет пароля для сброса для работы в моем родном интерфейсе React, поэтому мне приходится использовать шаблоны Django для этой функции. Я хочу иметь возможность изменить его стиль и иметь ссылки, которые будут соответствовать моему приложению как можно ближе. Но этот метод, как правило, должен позволять вам создавать свою собственную версию формы авторизации Django.