В настоящее время в моем urls.py у меня есть следующие ссылки для пользователя, чтобы сбросить свой пароль
app_name = 'users'
urlpatterns = [
path('password/', user_views.change_password, name='change_password'),
path('password-reset/', auth_views.PasswordResetView.as_view(template_name='users/password_reset.html', success_url=reverse_lazy('users:password_reset_done')), name='password_reset'),
path('password-reset/done/', auth_views.PasswordResetDoneView.as_view(template_name='users/password_reset_done.html'),name='password_reset_done'),
path('password-reset-confirm/<uidb64>/<token>/',auth_views.PasswordResetConfirmView.as_view(template_name='users/change_password.html',success_url=reverse_lazy('users:password_reset_complete')),name='password_reset_confirm'),
path('password-reset-complete/', auth_views.PasswordResetCompleteView.as_view(template_name='users/password_reset_complete.html'),name='password_reset_complete'),
]
вот change_password.html
<main class = "mt-5" >
<div class = "container dark-grey-text mt-5">
<div class = "content-section">
<form method = "POST">
{% csrf_token %}
<fieldset class = "form-group">
<legend class = "border-bottom mb-4">Reset Password</legend>
{{ form|crispy }}
</fieldset>
<div class = "form-group">
<button class = "btn btn-outline-info" type = "submit">Reset Password</button>
</div>
</form>
</div>
</div>
</main>
После того, как пользователь получит сообщение электронной почты для сброса и щелкнет ссылку для сброса пароля, он перейдет на страницу Django Admin Style для сброса пароля.
Как я могу передать шаблон, который у меня есть change_password.html
, и как я могу потом перенаправить на страницу входа для входа?
Просто чтобы добавить больше контекста, не уверен, что это может быть причиной в основном urls.py
urlpatterns = [
path('', include('django.contrib.auth.urls')),
path('admin/', admin.site.urls),
path('users/', include('users.urls'), ),
]
Вот терминал, показывающий последовательность:
"GET /users/password-reset/ HTTP/1.1" 200 1849
"POST /users/password-reset/ HTTP/1.1" 302 0
"GET /users/password-reset/done/ HTTP/1.1" 200 1339
"GET /reset/NTM/xxxxxxxxxxxxxxxxx/ HTTP/1.1" 302 0
"GET /reset/NTM/set-password/ HTTP/1.1" 200 2288
"POST /reset/NTM/set-password/ HTTP/1.1" 302 0
"GET /reset/done/ HTTP/1.1" 200 1459
🤔 А знаете ли вы, что...
Python поддерживает многозадачность и многопоточность.
Вы можете использовать PasswordResetConfirmView, а затем передать параметр template_name
.
Чтобы перенаправить пользователя на страницу входа после сброса пароля, вы можете установить атрибут login_url
на URL вашей страницы входа.
urls.py
from django.contrib.auth import views as auth_views
from users import views as user_views
app_name = 'users'
..............
path('login/', MyLoginView.as_view(redirect_authenticated_user=True, template_name='users/login.html'), name='login'),
path('password/', user_views.change_password, name='change_password'),
path('password-reset-confirm/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(template_name='users/change_password.html'), name='password_reset_confirm'),
path('password-reset-complete/', auth_views.PasswordResetCompleteView.as_view(template_name='users/password_reset_complete.html', login_url='/any-login-url/'), name='password_reset_complete'),
.............................
...............................
Попробуйте создать подкласс PasswordResetConfirmView
так:
# in views.py
from django.contrib.auth.views import PasswordResetConfirmView
from django.urls import reverse_lazy
class CustomPasswordResetConfirmView(PasswordResetConfirmView):
template_name = 'users/change_password.html'
post_reset_login = True
success_url = reverse_lazy('any-login-url')
Если для атрибута post_reset_login
установлено значение True, пользователь автоматически войдет в систему после сброса пароля и будет перенаправлен на URL-адрес, указанный в атрибуте success_url
.
Затем в urls.py
:
from .views import CustomPasswordResetConfirmView
urlpatterns = [
# ...
path('password-reset-confirm/<uidb64>/<token>/', CustomPasswordResetConfirmView.as_view(), name='password_reset_confirm'),
# ...
]