ログイン機能の実装を進めていきましょう。
今までのログインフォームは、あくまでも管理者がログインするためのものでした。
ここからは、管理者以外がログインをするための画面を作成していきます。
LoginViewの実装
まずはLoginViewを実装していきましょう。
普通であればviews.pyファイルにLoginViewを定義するのですが、実際はurls.pyファイルにコードを追記するだけでLoginViewを実装することが可能です(views.pyファイルにコードを書く必要がありません)。
早速コードを書いていきましょう。
コードBASE/urls.py
from django.contrib import admin
from django.urls import path, include ← new!
urlpatterns = [
path('admin/', admin.site.urls),
path('signup', SignUpView.as_view())
path('accounts/', include('django.contrib.auth.urls')), ← new!
]
イメージとしては、管理画面にアクセスするときに使われるadmin.site.urlsがわかりやすいかと思います。
これは、localhost:8000/adminにアクセスすることによって、管理画面を表示させることができました。
(viewsで管理画面の表示をコントロールする必要がありませんでした。)
これと同じように、django.contrib.auth.urlsを使うことによって、localhost:8000/accountsにアクセスすることでログイン画面を表示させることができるようになるのです。
ただ、管理画面の場合は表示するhtmlファイルまで準備されていましたが、ログインの場合はhtmlファイルをこちらで作らなければいけません。
djangoの初期設定では、LoginViewはregistrationフォルダの中のlogin.htmlファイルを呼び出すように設定されていますので、これに合わせて設定を進めていきましょう。
コマンドライン-BASE
$ mkdir templates/registration
$ cd templates/registration
$ touch login.html
login.htmlファイルにコードを書いていきます。
コード-BASE/templates/registration/login.html
<from method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">ログイン</button>
ここでのformは、djangoのデフォルトUserモデルによって既に設定されている「username」と「password」の項目が入っています。
これでログイン画面は完成です。
最後に、ログイン後に遷移させるurlをsettings.pyファイル上で設定します。
コードsettings.py
...
LOGIN_REDIRECT_URL = ' '
今回はログイン後に遷移させるurlを指定していませんが、この指定方法はTodoアプリで学んだ方法と同じです(urlpatten内のnameを書きます)。
これで設定は完了です。djangoがあらかじめ備えている機能によって、簡単に実装することができることがわかります。
実際にサーバーを立ち上げて、urlにlocalhost:8000/accounts/loginと打ってみましょう。
(accountsだけではなく、/loginを書き足さなければいけない点に注意してください。)
無事にログインフォームが表示されました。
ログイン後の表示を変える
ここから、見た目を整える方法についてみていきます。
例えば、ECサイトなどでは、ログインされたユーザーの場合、「〇〇さんこんにちは」といった形で、ログインユーザーの情報が記載されたりしていますよね。
djangoでもこのような実装が簡単にできます。
実際にコードを書いていきましょう。
まずは、ログイン後に表示されるhtmlファイルを作ります。
コマンドライン-BASE/templates
$ touch index.html
コード{{% if user.is_authenticated %}}
{{ user.username }}さん、こんにちは。
{% else %}
<p>ログインしていません</p>
{% endif %}
user.is_authenticatedを使うことで、ログインしているかどうかを分けることができます。
ここでは、user.is_authenticatedがTrueの場合(ログインしている場合)はログインした人の名前を表示するようにし、ログインしていない場合は「ログインしていません」という表示がされるようにしました。
このように、user.is_authenticatedを使うことによって、ログインの状態によって表示の内容を変えることができます。
ログアウトの仕方
最後に、ログアウトの設定も進めていきましょう。
djangoは、ログアウトも簡単にできるような機能が備えられています。
コード{{% if user.is_authenticated %}}
{{ user.username }}さん、こんにちは。
<a href="{% url 'logout' %}">ログアウト</a> ← new!
{% else %}
<p>ログインしていません</p>
{% endif %}
「url 'logout'」と書くことで、ログアウトするためのリンクを実装することができます。
ただし、ログインした時と同じく、ログイン後のurlを指定しなければいけません。
この設定は、settings.pyファイルで行います。
コードsettings.py
LOGOUT_REDIRECT_URL = ''
これでログアウトの実装をすることができました。
ログイン回りの実装を一から作ると大変な手間がかかるのですが、djangoを使うことによって、簡単に実装することができました。