rest-auth でアカウント登録とパスワードリセットを作成したのを適当に書き残しておこうと思ふ

色々試していたのですが個人的にはちょっと扱いにくく、結果的廃止としたので細かい使い方はまとめておりませんが、備忘録として残しておこうと思います。

参考

config/urls.py

from accounts import views as accounts_views
urlpatterns = [
    ...
    # rest-auth
    path('rest-auth/', include('rest_auth.urls')),
    path('rest-auth/registration/', include('rest_auth.registration.urls')),
    # メールに付与されてる URL で、クリックするとアカウントを有効化する「アカウント有効化」画面を開く。
    path('account-confirm-email/(?P<key>[-:\w]+)/$', TemplateView.as_view(), name='account_confirm_email'),
    # メールに付与されている URL で、クリックするとパスワードを 2 回入力する「パスワード再設定」画面を開く。
    path('password/reset/confirm/<uidb64>/<token>/', accounts_views.PasswordResetConfirm.as_view(), name='password_reset_confirm'),
    # パスワード再設定完了の「「パスワード再設定完了」画面を開く。
    path('password_reset/complete/', accounts_views.PasswordResetComplete.as_view(), name='password_reset_complete'),
    ...
]

accounts/views.py

from django.shortcuts import render
from django.contrib.auth.views import (
    LoginView, LogoutView, PasswordChangeView, PasswordChangeDoneView,
    PasswordResetView, PasswordResetDoneView, PasswordResetConfirmView, PasswordResetCompleteView
)
from django.urls import reverse_lazy
class PasswordResetConfirm(PasswordResetConfirmView):
    """新パスワード入力ページ"""
    success_url = reverse_lazy('password_reset_complete')
    template_name = 'account/password_reset_confirm.html'
class PasswordResetComplete(PasswordResetCompleteView):
    """新パスワード設定しましたページ"""
    template_name = 'account/password_reset_complete.html'

account/password_reset_confirm.html

<div class="modal">
    <div class="modal-window">
        <div class="modal-content">
            <div class="title-area">
                <h2>パスワード設定</h2>
            </div>
            {% if validlink %}
            <form method="post">{% csrf_token %}
                <div class="input-area">
                    <div class="input-area-wrapper">
                        <p>新しいパスワードを設定してください。</p>
                        <input type="hidden" autocomplete="username" value="{{ form.user.get_username }}">
                        <div class="form-row field-password1">
                            <input class="password" placeholder="password" type="password" name="new_password1" autocomplete="new-password" required="" id="id_new_password1">
                        </div>
                        <div class="form-row field-password2">
                            <input class="password" placeholder="password confirm" type="password" name="new_password2" autocomplete="new-password" required="" id="id_new_password2">
                        </div>
                    </div>
                </div>
                <div class="text-area">
                    <div class="text-area-wrapper">
                        {% if form.errors %}
                        {% for errors in form.errors.values %}
                            {% for error in errors %}
                                <div class="danger">{{ error }}</div>
                            {% endfor %}
                        {% endfor %}
                        {% endif %}
                    </div>
                </div>
                <div>
                    <div>
                        <div class="button-area">
                            <div class="button-area-wrapper">
                                <button class="positive" type="submit" value="パスワードを変更する">設定する</button>
                            </div>
                        </div>
                    </div>
                </div>
            </form>
            {% else %}
            <div class="input-area">
                <div class="input-area-wrapper">
                <p>パスワードリセットリンクが無効でした。</p>
                <p>既に使用されている可能性があります。</p>
                <p>新しいパスワードのリセットをリクエストして下さい。</p>
                </div>
            </div>
            {% endif %}
        </div>
    </div>
</div>

account/password_reset_complete.html

<div class="modal">
    <div class="modal-window">
        <div class="modal-content">
            <div class="title-area">
                <h2>パスワード再設定完了</h2>
            </div>
            <div class="text-area">
                <div class="text-area-wrapper">
                    <p>パスワードが再設定されました。</p>
                    <p>ログインして下さい。</p>
                </div>
            </div>
            <div class="button-area">
                <div class="button-area-wrapper">
                    <button class="button positive" onclick='location.href="{{ login_url }}"'>ログインページ</button>
                </div>
            </div>
        </div>
    </div>
</div>

アカウント作成時のリクエストを送信

...
this.axios.post(
    "/rest-auth/registration/", this.requestJson, config
).then((response) => {
...

パスワードリセット時のリクエストを送信

...
this.axios.post(
    "/rest-auth/password/reset/",this.requestJson, config
).then((response) => {
...

関連のある映画