Как передать change_password.html для замены сброса пароля администратора Django

В настоящее время в моем 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 поддерживает многозадачность и многопоточность.


2
55
1

Ответ:

Решено

Вы можете использовать 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'),
    # ...
]