Django adminサイトのパスワードリセット機能を有効にする

スポンサードリンク



こんにちは。sinyです。

この記事ではDjagnoのadmin画面でパスワードリセット機能を有効にする方法と簡易動作確認の手順についてまとめています。

Django公式ドキュメントにパスワードリセット機能を有効にする手順が記載されていますが、そのままだとうまく動かなかったため備忘録を兼ねて情報をまとめました。

なお、本記事は2021/5/9時点の最新であるDjangoバージョン3.2.2で確認したものです。

adminサイト上のパスワードリセット機能の有効化手順

Djangoのadminサイトにパスワードリセット機能を実装する手順については以下公式ドキュメントに記載されています。

Adding a password reset feature
You can add a password reset feature to the admin site by adding a few lines to your URLconf. Specifically, add these four patterns

 

具体的にはルートのurls.pyに以下のコードを追加するだけで有効化できると記載されています。

from django.contrib.auth import views as auth_views

path('admin/password_reset/',auth_views.PasswordResetView.as_view(),name='admin_password_reset'),
path('admin/password_reset/done/',auth_views.PasswordResetDoneView.as_view(),name='password_reset_done',),
path('reset/<uidb64>/<token>/',auth_views.PasswordResetConfirmView.as_view(),name='password_reset_confirm',),
path('reset/done/',auth_views.PasswordResetCompleteView.as_view(),name='password_reset_complete'),

設定後にadminサイトにアクセスすると下図の通りパスワードリセットのリンクは表示されるようになりますが、クリックしてもパスワードリセット機能が動きません。

問題なく動くようにするには以下のように修正する必要があります。
(なぜ公式のコードで動かないのかはよくわかりません。。)

from django.contrib import admin
from django.urls import path
from django.contrib.auth import views as auth_views

urlpatterns = [
    path('admin/', admin.site.urls),
    #パスワードリセットメール送信画面用
    path('admin_password_reset/',auth_views.PasswordResetView.as_view(),name='admin_password_reset',),
    #パスワードリセット完了画面用
    path('admin_password_reset/done/',auth_views.PasswordResetDoneView.as_view(),name='password_reset_done',),
    #パスワードリセット画面用
    path('reset/<uidb64>/<token>/',auth_views.PasswordResetConfirmView.as_view(), name='password_reset_confirm',),
    #パスワードリセット完了画面用
    path('reset/done/',auth_views.PasswordResetCompleteView.as_view(),name='password_reset_complete',),
]

変更箇所がわかりずらいですが、以下の2点修正が必要です。

変更箇所
  1. パスワードリセットメール送信画面用のURLパターンを'admin/password_reset/’→'admin_password_reset/'に変更
  2. パスワードリセット完了画面用のURLパターンを'admin/password_reset/done/'→'admin_password_reset/done/'に変更

これで問題なく機能するようになります。

動作確認する場合は、コンソールにパスワードリセットメールが届くようにsettings.pyに以下の設定を追加しておきましょう。

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

 

以上で設定完了です。

http://127.0.0.1:8000/adminにアクセスして「パスワードまたはユーザー名を忘れましたか?」をクリックすると以下のようなパスワードリセット機能を利用できることが確認できます。

以上、「Django adminサイトのパスワードリセット機能を有効にする」でした。

 

おすすめの記事