問題の発生
Djangoにログイン・ログアウト機能をつけたい!
まとめてみることにした。
参考
必要な設定
・ルーティング
・テンプレートの作成
・ログアウト機能の追加
ルーティング
・既にあるアプリのurls.pyにログインとログアウトのURLを設定
from django.contrib.auth import views as auth_views
urlpatterns = [
path('',views.TopViews.as_view(), name = 'top'),
path('login/', auth_views.LoginView.as_view(), name='login'),
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
]
あらかじめdjangoで設定されているLoginView
とLogoutView
を設定しているため、ログイン機能を実装できる。
・settings.pyにリダイレクト先の設定
今回、ログイン後は「...8000/」の画面URLに移動するようしたいため、LOGIN_REDIRECT_URL = '/'
とした。
LOGIN_URL = '/login' # ログインが必要なときのリダイレクト先
LOGIN_REDIRECT_URL = '/' # ログイン成功後のリダイレクト先
LOGOUT_REDIRECT_URL = '/login' # ログアウト後のリダイレクト先
テンプレートの作成
ログイン機能を持つテンプレートを作成するときは、以下の2つに注意する。
・registration/login.htmlとしてテンプレートを作成する。
・inputのnameにusernameとpasswordの値を設定する
<form method="post">
{% csrf_token %}
<div>
<label for="id_username">Username:</label>
<input type="text" name="username" id="id_username" required>
</div>
<div>
<label for="id_password">Password:</label>
<input type="password" name="password" id="id_password" required>
</div>
<button type="submit">Login</button>
</form>
なぜ、上記2つの設定が必要なのか
結論:LoginViewやLogoutViewを見てみると、以上の2つのような設定にしろと制定されているから。
詳細:loginやlogoutのルーティングが呼び出された際、
auth_views.LoginView.as_view()
やauth_views.LogoutView.as_view()
それぞれのviewが呼び出されるよう設定した。例えば、LoginViewの中身を見てみると、以下のような形になっている。※中身を見たい場合はfrom django.contrib.auth import views as auth_views
を参考にして追っていけば良い。「djangoフォルダ➝contribファイル➝viewsクラス」のように。Django公式の認証システムのドキュメントリンク
class LoginView(SuccessURLAllowedHostsMixin, FormView):
"~中略~"
authentication_form = None
redirect_field_name = REDIRECT_FIELD_NAME
template_name = 'registration/login.html'
...
ここでtemplate_name = 'registration/login.html'
となっている(テンプレート名はregistrationフォルダのlogin.htmlというファイル名にしてくださいよーとなっている)
input指定は長すぎて追えなかったのでそういうもんだと理解することにした、。(こういうのも大事だよね・・・?)
ログアウト
ルーティングの章でpath('logout/', auth_views.LogoutView.as_view(), name='logout'),
を設定しているので、LogoutViewが使用できるようになっているので、aタグにlogoutのURLを指定すればログアウトできる。
例
<a class="nav-item nav-link " href="{% url 'logout' %}">ログアウト</a>
学んだこと
DjangoのLoginView
とLogoutView
を使うことで、簡単にログイン・ログアウト機能を実装できる。ポイントは以下の通り
・settings.pyにログイン・ログアウト後のリダイレクト先を設定
・ルーティングを行って、LoginViewとLogoutViewを参照するようにする
・LoginViewとLogoutViewはDjangoのあらかじめ設定されているクラスで、ログイン機能を管理するクラスになっている。
・ログイン用のテンプレートとして、'registration/login.html'
でテンプレートを設定する。
初学者の参考になれば幸いです。