サイトアイコン 知的好奇心

Djangoのログイン処理を実装する方法②~パスワード変更~

Djangoのログイン認証パスワード変更処理を実装する方法をご紹介します。

以下の記事の続きです。

Djangoのログイン処理を実装する方法①

条件

パスワード変更処理

パスの追加

パスワード変更処理を使用するためにurls.pyにパスを追加します。

# sample/urls.py

from django.contrib import admin
from django.urls import path, include
from django.contrib.auth import views as auth_views # 追加

urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/', include('django.contrib.auth.urls')), 
    path('password_change/', auth_views.PasswordChangeView.as_view(template_name='password_change_form.html'), name='password_change'), # 追加
    path('password_change/done/', auth_views.PasswordChangeDoneView.as_view(template_name='password_change_done.html'), name='password_change_done'), # 追加
]

テンプレート追加

以下のパスからパスワード変更用のテンプレートをコピーします。

コピー元

コピー先(templatesフォルダの下)

動作確認

manage.py runserverを実行して以下のURLを開きます。
http://127.0.0.1:8000/password_change/
以下のような表示になればOKです。

パスワード変更画面の変更

このままでは管理画面を継承しているため、継承元を変更します。

以下2つのファイルについて「extends」を変更します。

変更前

{% extends "admin/base_site.html" %}

変更後

{% extends 'base.html' %}

再度動作確認をすると以下のような画面になります。
(画面デザインは適宜変更してください。)

各種リンクの追加

このままでは画面遷移に連続性がないため、各画面にリンクを張ります。

「パスワード変更画面」と「パスワード変更完了画面」にホーム画面へのリンクを張ります。

<!-- templates/password_change_form.html -->
{% extends 'base.html' %}
{% load i18n static %}
{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}">{% endblock %}
{% block userlinks %}{% url 'django-admindocs-docroot' as docsroot %}{% if docsroot %}<a href="{{ docsroot }}">{% trans 'Documentation' %}</a> / {% endif %} {% trans 'Change password' %} / <a href="{% url 'admin:logout' %}">{% trans 'Log out' %}</a>{% endblock %}
{% block breadcrumbs %}
<div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
&rsaquo; {% trans 'Password change' %}
</div>
{% endblock %}

{% block title %}{{ title }}{% endblock %}
{% block content_title %}<h1>{{ title }}</h1>{% endblock %}

{% block content %}<div id="content-main">

<form method="post">{% csrf_token %}
<div>
{% if form.errors %}
    <p class="errornote">
    {% if form.errors.items|length == 1 %}{% trans "Please correct the error below." %}{% else %}{% trans "Please correct the errors below." %}{% endif %}
    </p>
{% endif %}


<p>{% trans "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly." %}</p>

<fieldset class="module aligned wide">

<div class="form-row">
    {{ form.old_password.errors }}
    {{ form.old_password.label_tag }} {{ form.old_password }}
</div>

<div class="form-row">
    {{ form.new_password1.errors }}
    {{ form.new_password1.label_tag }} {{ form.new_password1 }}
    {% if form.new_password1.help_text %}
    <div class="help">{{ form.new_password1.help_text|safe }}</div>
    {% endif %}
</div>

<div class="form-row">
{{ form.new_password2.errors }}
    {{ form.new_password2.label_tag }} {{ form.new_password2 }}
    {% if form.new_password2.help_text %}
    <div class="help">{{ form.new_password2.help_text|safe }}</div>
    {% endif %}
</div>

</fieldset>

<div class="submit-row">
    <input type="submit" value="{% trans 'Change my password' %}" class="default">
</div>

</div>
</form></div>

<a href="{% url 'home' %}">トップへ</a>
{% endblock %}
<!-- templates/password_change_done.html -->
{% extends 'base.html' %}
{% load i18n %}
{% block userlinks %}{% url 'django-admindocs-docroot' as docsroot %}{% if docsroot %}<a href="{{ docsroot }}">{% trans 'Documentation' %}</a> / {% endif %}{% trans 'Change password' %} / <a href="{% url 'admin:logout' %}">{% trans 'Log out' %}</a>{% endblock %}
{% block breadcrumbs %}
<div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
&rsaquo; {% trans 'Password change' %}
</div>
{% endblock %}

{% block title %}{{ title }}{% endblock %}
{% block content_title %}<h1>{{ title }}</h1>{% endblock %}
{% block content %}
<p>{% trans 'Your password was changed.' %}</p>

<a href="{% url 'home' %}">トップへ</a>
{% endblock %}

base.htmlにパスワード変更画面へのリンクを張ります。

ログイン状態のときのみパスワード変更画面へのリンクが表示されるようにします。
ついでにログインとログアウトのリンクも追加します。

<!-- templates/base.html -->
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>{% block title %}Django Auth Tutorial{% endblock %}</title>
</head>
<body>
  <main>
      {% if user.is_authenticated %}
        <li><a href="{% url 'logout' %}" class="logout">ログアウト</a></li>
            {% if form_name == "password_change" %}
            {% else %}
                <li><a href="{% url 'password_change' %}" class="logout">パスワード変更</a></li>
            {% endif %}
        {% else %}
            <li><a href="{% url 'login' %}" class="login">ログイン</a></li>
        {% endif %}
    {% block content %}
    {% endblock %}
  </main>
</body>
</html>

画面一覧

画面は以下のようになります。

未ログイン状態

ホーム画面

http://127.0.0.1:8000/

ログイン画面

http://127.0.0.1:8000/accounts/login/

ログイン状態

ホーム画面

http://127.0.0.1:8000/

パスワード変更画面

http://127.0.0.1:8000/password_change/

パスワード変更完了画面

http://127.0.0.1:8000/password_change/done/

以上でパスワード変更画面の追加は終わりです。

参考

公式ドキュメント
https://docs.djangoproject.com/ja/2.1/topics/auth/default/
Django

モバイルバージョンを終了