Djangoには予めログイン・ログアウトなどユーザー管理用のビューが用意してあります。そのためテンプレートファイルを作成するだけでログイン・ログアウト画面とその機能を実装できます。
目次
- ルーティング
- ログイン・ログアウト用テンプレートディレクトリの作成
- 共通テンプレートの作成
- ログイン用テンプレートの作成
- ログアウト用テンプレートの作成
- ログイン後のリダイレクト設定
- 日本語化
- 動作確認
ルーティング
Djangoが用意してくれているユーザー管理用のビューを呼び出すルーティングは予め次のように決まっています。
役割 | ルート |
---|---|
ログイン | accounts/login/ |
ログアウト | accounts/logout/ |
パスワード変更 | accounts/password_change/ |
パスワード変更結果 | accounts/password_change/done/ |
パスワードリセット | accounts/password_reset/ |
パスワードリセット結果 | accounts/password_reset/done/ |
アカウントリセット | accounts/reset/(uidb64)/(token)/ |
アカウントリセット結果 | accounts/reset/done/ |
これを利用するには config/urls.py に次のように記述します。
from django.contrib import admin from django.urls import path, include from django.views.generic import RedirectView urlpatterns = [ path('admin/', admin.site.urls), path('hello/', include('hello.urls')), path('bbs/', include('bbs.urls')), path('accounts/', include('django.contrib.auth.urls')), # ユーザー認証用のビューを呼び出す path('', RedirectView.as_view(url='/bbs/')), ]
この記述だけで上記のDjangoが用意してくれているユーザー管理用ビューへのルーティングが設定できます。
ログイン・ログアウト用テンプレートディレクトリの作成
ログイン・ログアウト用のテンプレートのディレクトリは registration という名前に決まっています。
templates ディレクトリの下に registration ディレクトリを作成しましょう。
ここにログイン・ログアウト画面用のテンプレートを作成します。
共通テンプレートの作成
ログイン・ログアウト画面の共通テンプレートを作成しましょう。
registrationディレクトリに base.html を作成し、次のように記述します。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>Djangoのユーザー管理機能を使ってみよう!</title> <style>h1 {color: #0000ff}</style> </head> <body> {% block content %} {% endblock %} </body> </html>
共通テンプレートにはタイトルやメタ情報など、ログインページとログアウトページで共通する内容を記述します。
ログイン用テンプレートの作成
次に registrationディレクトリにログイン用テンプレートを作成します。
これは login.html というファイル名にする必要があります。
{% extends './base.html' %} {% block content %} <h1>Djangoで作るログイン機能</h1> {% if user.is_authenticated %}<!-- ユーザーを認証していたら --> <p>{{ user }} でログインしています</p> <button onclick='location.href="{% url "logout" %}"'>ログアウト</button> {% else %} <section> <!-- ログイン用フォーム --> <form action='{% url "login" %}' method='post'> {% csrf_token %} <input type='hidden' name='next' value='{{ next }}'/><!-- csrf_token用の隠し項目 --> {{ form.as_p }}<!-- ログイン用の項目 --> <button type='submit'>ログイン</button> </form> </section> {% endif %} {% endblock %}
ページにアクセスしたユーザーが認証済みの場合、「(ユーザー名)でログインしています」というメッセージとログアウトボタンを表示し、そうでない場合はログイン用のフォームとログインボタンを表示します。
ログアウト用テンプレートの作成
次に registrationディレクトリにログアウト用テンプレートを作成します。
こちらも logged_out.html に名前が決まっています。
{% extends './base.html' %} {% block content %} <h1>ログアウトしました</h1> <p>ご利用ありがとうございました。</p> <button onclick='location.href="{% url "login" %}"'>ログイン</button> {% endblock %}
こちらはログアウト後に表示するメッセージと、改めてログインするためのボタンを表示しています。
ログイン後のリダイレクト設定
最後に、ログイン後にリダイレクトするページの設定をしておきましょう。
/config/settings.py に次のように記述します。
# 前略 LOGIN_REDIRECT_URL = '/' # 後略
ログイン後はトップページにリダイレクトするよう設定しました。
この講座では以前、トップページにアクセスすると /bbs/ にリダイレクトするようルーティングを設定してあるので、ログイン後は /bbs/ にリダイレクトされます。
日本語化
このユーザー管理機能はDjangoが予め用意してくれているものなので、エラーメッセージや項目名はDjangoで設定されている言語で表示されます。
デフォルトでは英語(アメリカ)に設定されているので日本語化しておきましょう。
/config/settings.py を次のように修正します。
LANGUAGE_CODE = 'ja'
これでDjangoの設定言語が日本語になりました。
動作確認
それでは動作確認です。
Djangoコマンドを使ってサーバーを起動し、ブラウザで確認してみましょう。
http://127.0.0.1:8000/accounts/login/ にアクセスします。
ログイン画面が表示されました。
現在はログインしていない状態なのでフォームとログインボタンが表示されています。
試しにデタラメなユーザー名とパスワードでログインしようとしてみましょう。
このように登録されていないユーザー名とパスワードではログインすることができません。
では、この講座で以前作成してあるスーパーユーザーでログインしてみましょう。
ログインが成功し、投稿一覧ページにリダイレクトされました。
この状態でもう一度 http://127.0.0.1:8000/accounts/login/ にアクセスしてみましょう。
今度はログインしている状態なので、ログイン中のユーザー名とログアウトボタンが表示されました。
ログアウトボタンをクリックしてみましょう。
ログアウトできました。
ログインボタンをクリックすると再びログインページにアクセスできます。
ログイン・ログアウトページの完成です!