【Django】パスワード変更フォームを自作する方法

アイキャッチ画像
  • Djangoでパスワード変更フォームを作成するには?
  • フォームのデザインなどをカスタマイズするには?

本記事ではこのような疑問を解決します。


Webアプリケーションにおいて、会員登録機能やログイン機能を実装すると、もれなく考えないといけないのがパスワードです。

また、セキュリティ的にもユーザーのパスワード変更フォームは必須です。

ではDjangoにおけるパスワード変更フォームはどのように作成するのか。

また、フォームのデザインなどはどのようにカスタマイズするのか。


そこで今回はDjangoでパスワード変更フォームを自作する方法を解説していきます。

なお、本記事ではフォームの作成にフォーカスするため、モデルの定義やURLの設定などは省略します。

forms.pyを編集する

まずはforms.pyにて、Formクラスの記述をします。

ここではパスワード変更時に、
「元のパスワードを入力させるパターン」と、
「元のパスワードを入力させないパターン」の2つをご紹介します。

元のパスワードを入力させるパターン

「元のパスワードを入力させるパターン」ではDjangoのPasswordChangeFormクラスを継承します。

from django.contrib.auth.forms import PasswordChangeForm


class MyPasswordChangeForm(PasswordChangeForm):

    # テンプレートにおいて表示されるinputタグのカスタマイズは以下のように行う(下は一例)
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['old_password'].widget.attrs['class'] = '【class名】'# classの指定
        self.fields['new_password1'].widget.attrs['class'] = '【class名】'
        self.fields['new_password2'].widget.attrs['class'] = '【class名】'
        self.fields['new_password1'].widget.attrs['placeholder'] = '半角英数字8文字以上'# placeholderの指定
        self.fields['new_password2'].widget.attrs['placeholder'] = 'パスワード確認用'

元のパスワードを入力させないパターン

「元のパスワードを入力させないパターン」ではDjangoのSetPasswordFormクラスを継承します。

from django.contrib.auth.forms import SetPasswordForm


class MySetPasswordForm(SetPasswordForm):

    # テンプレートにおいて表示されるinputタグのカスタマイズは以下のように行う(下は一例)
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['new_password1'].widget.attrs['class'] = '【class名】'# classの指定
        self.fields['new_password2'].widget.attrs['class'] = '【class名】'
        self.fields['new_password1'].widget.attrs['placeholder'] = '半角英数字8文字以上'# placeholderの指定
        self.fields['new_password2'].widget.attrs['placeholder'] = 'パスワード確認用'

views.pyを編集する

次にviews.pyにて、処理の記述します。

ここでも以下の2パターンを示します。

元のパスワードを入力させるパターン

from .models import User
from .forms import MyPasswordChangeForm
from django.shortcuts import render, redirect


# パスワード変更フォームを表示する処理
def password_change(request):
    template_name = 'password_change.html'
    form = MyPasswordChangeForm(user=request.user)
    context = {
        'form': form,
    }
    return render(request, template_name, context)


# パスワードの変更を保存する処理
def password_change_post(request):
    if request.method == 'POST':
        form = MyPasswordChangeForm(request.POST)
        if form.is_valid():
            form.save()
    return redirect('【リダイレクト先】')

元のパスワードを入力させないパターン

from .models import User
from .forms import MySetPasswordForm
from django.shortcuts import render, redirect


# パスワード変更フォームを表示する処理
def password_change(request):
    template_name = 'password_change.html'
    form = MySetPasswordForm(user=request.user)
    context = {
        'form': form,
    }
    return render(request, template_name, context)


# パスワードの変更を保存する処理
def password_change_post(request):
    if request.method == 'POST':
        form = MySetPasswordForm(request.POST)
        if form.is_valid():
            form.save()
    return redirect('【リダイレクト先】')

テンプレートを作成する

最後にテンプレートを作成します。

今回はCSSが考慮外のため、必要最低限のページになります。

デザインなどを反映させたい場合は適宜classやidを追加してください。

元のパスワードを入力させるパターン

<!DOCTYPE html>
<html>
<head></head>
<body>
    <form action="{% url 'password_change_post' %}" method="POST">
        <p>元のパスワード:{{ form.old_password }}</p>
        <p>新しいパスワード:{{ form.new_password1 }}</p>
        <ul>
            <li>ご登録情報に似たパスワードにはできません。</li>
            <li>8文字以上32文字以内で設定してください。</li>
            <li>よく使われるパスワードにはできません。</li>
            <li>数字だけのパスワードにはできません。</li>
        </ul>
        <p>新しいパスワード(確認用):{{ form.new_password2 }}</p>
        <button>パスワードを変更する</button>{% csrf_token %}
    </form>
</body>
</html>

元のパスワードを入力させないパターン

<!DOCTYPE html>
<html>
<head></head>
<body>
    <form action="{% url 'password_change_post' %}" method="POST">
        <p>新しいパスワード:{{ form.new_password1 }}</p>
        <ul>
            <li>ご登録情報に似たパスワードにはできません。</li>
            <li>8文字以上32文字以内で設定してください。</li>
            <li>よく使われるパスワードにはできません。</li>
            <li>数字だけのパスワードにはできません。</li>
        </ul>
        <p>新しいパスワード(確認用):{{ form.new_password2 }}</p>
        <button>パスワードを変更する</button>{% csrf_token %}
    </form>
</body>
</html>

まとめ

以上がDjangoでパスワード変更フォームを自作する方法になります。

本記事を参考に、フォーム全体やinputタグをカスタマイズすることでそれぞれのWebアプリケーションに合ったパスワード変更フォームが自作できます。

最後までお読みいただきありがとうございました。